5

誰かがこれを説明できますか?

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ではなく、論理的ではありません...

この違いはなぜですか?

ありがとう

4

5 に答える 5

7

浮動小数点数の素晴らしい世界:

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 進展開を持つものだけです。

于 2011-11-25T14:36:41.903 に答える
3

浮動小数点エラー。40.7 は float で正確に表すことはできません。40.700000001 のようなものになります。あなた* 100とそれを天井にすると、4071 に切り上げられます。

于 2011-11-25T14:35:25.177 に答える
0

浮動小数点数の問題...次のような問題を解決できます。

echo ceil( (int) (40.7 * 100) );
于 2011-11-25T14:42:44.453 に答える