teratail header banner
teratail header banner
質問するログイン新規登録

質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

951閲覧

PHP %f 出力について(浮動小数点)

noby_

総合スコア21

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/03/04 09:48

編集2020/03/04 11:16

0

0

問題

浮動小数点についてですが、解説を見ると四捨五入すると書いてありました。
しかし、以下のコードの答えは 3.2 です。
なぜ、計算が3.25になるのに3.3にはならないのでしょうか。
教えて頂けると嬉しいです。

したこと

php7の問題集の解説とネットで調べた。

php

1$price = 5; 2$off = 0.35; 3 4printf (`Price : $%.1f`, $price * (1 - $off));

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

printf 系での浮動小数点の丸めはどうなっているのか厳密なところが分かりません。
ですから丸めを printf に頼るのではなく、明示的に round() を呼び出すほうがよいでしょう。

PHP

1$price = 5; 2$off = 0.35; 3 4printf("Price : $%.1f\n\n", $price * (1-$off)); 5 6printf("HALF_UP Price: $%.1f\n", round($price * (1-$off), 1, PHP_ROUND_HALF_UP)); 7printf("HALF_DOWN Price: $%.1f\n", round($price * (1-$off), 1, PHP_ROUND_HALF_DOWN)); 8printf("HALF_EVEN Price: $%.1f\n", round($price * (1-$off), 1, PHP_ROUND_HALF_EVEN)); 9printf("HALF_ODD Price: $%.1f\n", round($price * (1-$off), 1, PHP_ROUND_HALF_ODD));

結果は

Price : $3.2 HALF_UP Price: $3.3 HALF_DOWN Price: $3.2 HALF_EVEN Price: $3.2 HALF_ODD Price: $3.3

と、四捨五入の仕方によって異なってきますので、どれが最適か確認してください。

投稿2020/03/04 10:52

tacsheaven

総合スコア13707

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

小数点以下の最後の桁は信用してはいけません
とりあえずはごく小さな値を足すだけで調整が効くかもしれません。
もしくは明示的に四捨五入することです

投稿2020/03/04 10:06

編集2020/03/04 10:11
yambejp

総合スコア117816

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/03/04 10:06

for($i=0;$i<=9;$i++){ for($j=0;$j<=9;$j++){ $k=$i+$j/10+0.05; printf ("%s : %.1f : %.1f :%.1f<br>",$k,$k,$k+0.1**15,round($k,1)); ; } }
noby_

2020/03/04 10:12

それでしたら計算式の答えが 3.256の場合の%.1fは 3.3になり %.2fの場合は信用できないので3.25になるという解釈でよろしいでしょうか??
yambejp

2020/03/04 10:22 編集

> 3.256の場合 仮に内部的に3.255999...だとしても %.1fなら3.3 %.2fなら3.26 になりますよね 信用できないとは小さな端数がでる可能性が有るということですので 四捨五入するかぎり3.256が3.25になることはありません
noby_

2020/03/04 16:48

理解できました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問