2017-12-12 4 views
1

浮動小数点数を追加すると、一貫性のない不一致が発生します。 浮動小数点数は正確ではないことに気付いていますが、1.95を1.95に追加して3.8999999の代わりに3.9 にするにはどうすればよいですか?丸めは機能しません。 number_formatは最後の 結果を修正できますが、追加中は反映されません。PHPで浮動小数点の追加を不正確にする方法を教えてください。

$amountPaid = 0; 
var_export($amountPaid); echo "<br>\n"; 
$amountPaid = $amountPaid + 1.95; 
var_export($amountPaid); echo "<br>\n"; 
$amountPaid = $amountPaid + 1.95; 
var_export($amountPaid); echo "<br>\n"; 
$amountPaid = $amountPaid + 1.95; 
var_export($amountPaid); echo "<br>\n"; 
$amountPaid = $amountPaid + 1.95; 
var_export($amountPaid); echo "<br>\n"; 
$amountPaid = $amountPaid + 1.95; 
var_export($amountPaid); echo "<br>\n"; 
$amountPaid = $amountPaid + 1.95; 
var_export($amountPaid); echo "<br>\n"; 

echo '<h1>Rounding does not work</h1>'; 
var_export(round($amountPaid,1)); echo "<br>\n"; 

これが出力されます。

0 
1.95 
3.8999999999999999 
5.8499999999999996 
7.7999999999999998 
9.75 
11.699999999999999 
Rounding does not work 
11.699999999999999 

私もnumber_formatを使用して、すべてのステップで丸め(それは文字列を返す)と$amountPaid +=構文を使用してみました。

+0

丸められた値の正しい結果を得るには、 'var_export'の代わりに' var_dump'を使うことを考えてください。 – Philipp

+1

すべての段階で丸めません。あなたが値を表示する必要があるとき、最後に丸めます。そうでなければ、実際にはすべての段階でエラーを増やしています。 –

答えて

4

あなたの問題はvar_export

では、バージョン5.4.22でvar_exportはなく一方が浮動小数点数の通常の出力に を使用精度より、設定INI serialize_precisionを使用するためのように見えます。その結果、 のバージョン5.4.22(例えば、var_export(1.1)は 1.1000000000000001(17はデフォルトの精度値です))を出力します。それに加えて

http://php.net/manual/de/function.var-export.php#113770

私はserialize_precisionsettingは、PHP 7.1で-1に変更し、あなたのコードがうまく機能することを、言及する必要があります。

var_exportの代わりに、echoを値の出力に使用するか、var_dumpを使用して値をダンプします。

ほとんどの場合、計算を行い、印刷した場合に値を丸めるだけで、コードは正常に動作します。より高い精度が必要な場合は、bc mathのような大きなライブラリで作業する必要があります。彼らはIEEE番号ほど高速ではありませんが、このような丸めの問題はありません。

+0

ああ!その場合、問題は実際には値が最終的に出力される 'fputcsv'です - 私はvar_exportを使ってデバッグすると、間違った方向に私を送り込んでいました。 私は 'fputcsv'に渡す前に' number_format'に値をラップしました。それは問題を解決しました。ありがとう! – Patabugen

関連する問題