2016-11-15 7 views
0

データベースの値のリストを取得し、すべての行の合計を取得するために追加します。 PHPは追加を正しく行っていないため、なぜその理由が分かりません。私は何をしているのかお金を稼いでいる。結果はゼロになりますが、PHPは結果を$ -1.78と計算しています。次の何が問題である:値のリストを追加するPHPが正しく合計されない

public function testAddition() 
{ 
    $data = ['23.21','-38.20','14.99','0.00']; 
    $total = 0; 
    foreach ($data as $value) { 
    $total += round(floatval($value), 2); 
    var_dump($value); // value to add 
    var_dump($total); // new total 
    } 
    // PHPunit results a success to zero, this is wrong, $total = -1.776... 
    $this->assertEquals(0, $total); 
} 

出力以下:

string(5) "23.21" // value to add 
float(23.21) // new total 
string(6) "-38.20" // value to add 
float(-14.99) // new total 
string(5) "14.99" // value to add 
float(-1.7763568394003E-15) // <-- this is wrong, should be zero 
string(4) "0.00" // value to add 
float(-1.7763568394003E-15) // new total 

答えて

1

結果は-1.7763568394003E-15または0.0000000000000017763568394003です。それは、「丸められた」= 0.00のときである。これはちょうど問題を浮動小数点数として計算する - ほぼいつもどこかで小さな余りになるでしょう

解決方法は同様に丸めますか?または、100倍で100を使用してからintを使用し、100で再度割ります(理論的には除算が残ります)

また、あなたの質問に答えることはできませんが、floatvalは必要ありません。 $total += round($value, 2);をPHPとして使用するだけで、あなたのために自分のキャストになります。

+0

ありがとう私はこれを投稿した直後に私のエラーを見つけました。私たちのHTMLフォームは通貨を'12、345.67 'でフォーマットします。指数を取り除いて浮動小数点数に変換する前に、入力文字列から非数値を取り除く共通のルーチンがあります。愚かな問題。 – user3720435

関連する問題