1

重複の可能性:
浮動小数点精度の問題を制限するためのプラクティス

新しいtotalSubsのリストを現在の合計に追加すると、PHPは奇妙な値を返します。以下の出力を生成しました(40行目を参照)。

1 The total currently '0' (integer) + new TotalSub '-26969.55' type(double) = total '-26969.55'
2 The total currently '-26969.55' (double) + new TotalSub '249.6' type(double) = total '-26730.05'
...
39 The total currently '-164.89' (double) + new TotalSub '61.95' type(double) = total '-112.94'
40 The total currently '-102.94' (double) + new TotalSub '98.71' type(double) = total '-5.3300000000009'
41 The total currently '-5.3300000000009' (double) + new TotalSub  '50' type(double) = total '45.769999999999'

PHPの生成は次のとおりです。

echo ($count++) . " The total currently '$totalTrans' (".gettype($totalTrans).") + new TotalSub '$totalVar' type(".gettype($totalVar).") = total '" . ($totalTrans + $totalVar) ."'<br />";

00000000009を修正するにはどうすればよいですか?

4

2 に答える 2

1

私が見ることができるものから。
入力データに100を掛けて、最後に合計を100で割ってみてください。

1または10を掛けても、小数点以下2桁が原因である可能性があり、100を使用すると、値は整数(int)になります。

浮動小数点データ型(DOUBLEなど)は正確な数値を表すものではなく、概算であることに注意してください。

()を使用することは、文字列として返さずに()を使用することと同じbcmath()であるため、将来、数学の計算に使用できます。http://php.net/manual/en/book.bc.phpnumber_formatround

于 2013-01-29T12:51:45.270 に答える
1

printfその問題を解決し、同時にコードを見やすくするために使用します。

printf("%d The total currently '%.2f' (%s) + new TotalSub '%.2f' (%s) = total (%.2f)<br />",
       $count++,
       $totalTrans,
       gettype($totalTrans),
       $totalVal,
       gettype($totalVar),
       $totalTrans + $totalVar);
于 2013-01-29T12:54:44.123 に答える