浮点返回奇怪的值

时间:2013-01-29 12:50:26

标签: php floating-point

  

可能重复:
  Practices to limit floating point accuracy problems

当我将新的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?

2 个答案:

答案 0 :(得分:1)

从我所看到的。
尝试将输入数据乘以100,然后将总数除以100。

多次扫描1或10很可能无法纠正它可能是由于2位小数而使用100这些值现在是整数(整数

请记住,浮点数据类型(例如 DOUBLE )不代表确切数字并且是近似值。

您可以在将来使用bcmath()进行数学计算,因为使用number_format()与使用round()没有区别,而不将其作为字符串返回。
http://php.net/manual/en/book.bc.php

答案 1 :(得分: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);