誰かがこれを説明できますか?
echo ceil( 20.7 * 100 ); // returns 2070
echo ceil( 2070 ); // returns 2070
すべてOKで論理的ですが、
echo ceil( 40.7 * 100 ); // returns 4071
echo ceil( 4070 ); // returns 4070
OKではなく、論理的ではありません...
この違いはなぜですか?
ありがとう
浮動小数点数の素晴らしい世界:
printf("%.18f\n", 40.7*100);
//prints 4070.000000000000454747
printf("%.18f\n", 20.7*100);
//prints 2070.000000000000000000
要するに、浮動小数点数はすべての有理数を正確に表すことはできません。特に、407/10 も 207/10 も正確に表すことができないため、整数変換の結果には常に 1 単位の不確実性があります。
2 進浮動小数点数として正確に表すことができる唯一の有理数は、「小さな奇数整数倍の 2 乗」の形式、つまり小さな 2 進展開を持つものだけです。
浮動小数点エラー。40.7 は float で正確に表すことはできません。40.700000001 のようなものになります。あなた* 100
とそれを天井にすると、4071 に切り上げられます。
浮動小数点数の問題...次のような問題を解決できます。
echo ceil( (int) (40.7 * 100) );