2017-07-06 11 views
1

なぜ次の結果が異なるのですか?sprintf rounding

echo 2.55 * 100; 
echo sprintf(' %d', 2.55 * 100); 

出力:

255 254 
+0

[開始ポイント](http://floating-point-gui.de/) –

+0

@ MarkBakerこれは彼の問題の出発点ではありません。 – Xatenev

+0

[浮動小数点演算は壊れていますか?](https://stackoverflow.com/questions/588004/is-floating-point-math-broken) – Qirel

答えて

2

ベース2の固定サイズ表現は整数と%dない2.55 * 100のでラウンドない:

var_dump(sprintf('%d', 1.99)); 
string(1) "1" 
とは異なり
float(254.99999999999997158) 

echo $numeric_variableは、文字列から数値に変換するための専用のメカニズムを持っていません。 default rulesを使用して文字列に変換するだけなので、(string)$numeric_variableまたはstrval($numeric_variable)と同じです。この場合、

  • 可変型はfloatなので、float(2進数のIEEE 754から10進数への変換を意味する)を表すようにします。
  • それは表現微調整するprecisionディレクティブを読み取ります

    浮動小数点数で表示された有効桁数を。 -1は、そのような数値を丸めるための拡張アルゴリズムが使用されることを意味します。

変換、必要に応じてラウンドをキャストする文字列を小数にIEEE 754の誤差を低減するために。私のコンピュータのデフォルトでは、precision14です。これは9の数にかなり近くなっています。

+0

@Xatenev 9の数が多いことにご注意ください。あなたはデフォルト精度に頼っています( 'ini_get( 'precision')'); –

+0

私の間違いを実現しました。 +1 – Xatenev

+0

ありがとう、私はなぜ 'エコーsprintf( '%d'、2.55 * 100);'が254を出力するのか理解しています。それについて何が違うのですか? – DrRumpus