round()返回多余的小数

时间:2015-03-09 15:20:01

标签: php rounding precision floating-point-precision

我已经编写了很多PHP应用程序,并且偶然发现了一个奇怪的场景。圆函数似乎不是在一组非常复杂的代码中工作。在打电话之前,我尝试了许多不同的事情,但这并不起作用。给定round($val,2)时,函数返回0.56000000000000001,$val=0.5600。这显然应该返回0.56。

我已将代码更改为使用number_format($val,2,',','')。这似乎解决了这个问题,但现在我第二次猜测我的所有其他代码。

我应该用number_format替换round到处吗?是否有人有过类似的错误?

另外要注意,这似乎与本例中使用的PhpExcel相关联。 https://github.com/PHPOffice/PHPExcel/issues/237

2 个答案:

答案 0 :(得分:2)

无需将round替换为number_format。您可以使用带有标记的round向下舍入。

选择最适合应用程序的内容。

  • 你是否围绕float?使用round
  • 您想要格式化一个数字和数组吗?使用number_format

<?php 
$number = '0.5600'; 
echo round((float)$number, 2, PHP_ROUND_HALF_DOWN);

https://eval.in/297781

答案 1 :(得分:0)

问题是并非每个十进制数都可以在标准浮点中精确表示。这是一个非常普遍的问题,你的并不是唯一的。如果你需要精确的表示,那么你所做的,即将浮点数转换为字符串,就足够了。

其他一些解决方案:

  • ==转换为<=>=
  • ==转换为公差,例如b–ε ≤ a ≤ b+εε相对于|a||b|或两者都有一些常数或值