2

私はバイナリ形式での浮動小数点表現を十分に認識しているため、プログラミング言語で浮動小数点数を完全に表現しようとすると、数学的な「不可能」があることを知っています。ただし、プログラミング言語は、近似を処理する際に、よく知られた確立された規則に従うことを期待しています。

そうは言っても、私は(ここでもstackoverflowで)PHPのprintfがおそらく数値を「正しく切り捨て/概算」するための最良の方法であることを読みました。私に「完璧な」近似を与えるために。これは、「XXX を使用しないのはなぜですか、または YYY を使用しないのですか?」のような回答を避けるためです。

これを試して:

for($i=0; $i<10; $i++) {
  $k = 1.50 + $i/1000;
  printf("%f %.2f<br>", $k, $k);
}

これは出力です:

1.500000 1.50
1.501000 1.50
1.502000 1.50
1.503000 1.50
1.504000 1.50
1.505000 1.50
1.506000 1.51
1.507000 1.51
10.508000
1.5.0915

簡単にわかるように、1.504 は (正しく) 1.50 として出力され、1.506 は (正しく) 1.51 として出力されます。しかし、なぜ 1.505 が 1.50 と印刷されるのでしょうか?! 1.50 ではなく、1.51 でなければなりません。

ありがとうございました...

4

1 に答える 1