2016-08-19 7 views
1

私は金融アプリケーションに取り組んでいます。私はdouble(30,20)のように20に小数を格納します。私は計算中に奇妙な問題を抱えています。私はLaravel5.2を使用しています。 PHP、Laravel、エクセルnumber_format計算に奇妙な問題があります

Input1 = 280.95000000000000  
Input2 = 278.76250000000000 

// Results Number_format to 14 
$result = Input1 - Input2; 
PHP = 2.18750000000000 
Laravel = 2.18750000000006 
Excel = 2.18749999999994 

これら三つの異なる結果の効果最終%の結果に
3つの異なる結果。なぜこれが違うのか誰にでも分かります。

答えて

0

Excelの精度は最大15桁(8ビット)のhttps://en.wikipedia.org/wiki/Numeric_precision_in_Microsoft_Excelです。 Laravalは15ビットです。 PHPは約14ビットですhttp://php.net/manual/en/language.types.float.php

多くの数字は正確に小数点で表すことはできませんので、エラーが発生します。単純な解決策の1つは、小数点を整数だけにすることです。 MySQLの約2倍何

Input1 = 280.9500000000*10000 -> 2809500 
Input2 = 278.7625000000*10000 -> 2787625 
result = (Input1-Input2)/10000 -> 21.875 
+0

が、それは、二重保存することができている(30,20) –

+0

あなたが(バイナリで)0.1〜100小数点以下の桁を持つことができ、それはまだ不正確になります。 http://www.exploringbinary.com/why-0-point-1-does-not-exist-in-floating-point/純粋な数学では、すべての小数は同等の2進数を持ちます。浮動小数点数学では、これは真実ではありません。 –

関連する問題