圆形浮动不起作用

时间:2014-02-18 09:23:12

标签: floating-point rounding

我想知道为什么我的花车没有四舍五入。 当我这样做时:

$shipping_cost = float(57.599999999999994) 
round($shipping_cost, 2)

结果是:57.600000000000001

你知道为什么会这样吗? 它与服务器有关吗?

谢谢

2 个答案:

答案 0 :(得分:1)

由于大多数语言代表浮点值的方式,这种情况正在发生。

答案 1 :(得分:1)

虽然您没有指定使用的语言或实现,但几乎可以肯定使用IEEE-754 64位二进制浮点格式。

在这种格式中,有限数表示为整数 f 从-2 53 到+2 53 (不包括)和两个提出在-1074到971(含)范围内的某些功率 e 。每个有限浮点值的形式为 f •2 e 。 (这些部分在编码存储时略有改变,但此描述在数学上是等效的。)

要表示一个数字,有必要将其置于此表格中。例如,.75是3•2 -2

在此表单中,值57.6不能写为完全。最接近的可能值是8106479329266893•2 -47 = 8106479329266893/140737488355328 = 57.60000000000000142108547152020037174224853515625。 (你不能接近57.6,因为在分子上加上+1或-1会使值远离57.6并且向指数加1会使分子超过2 53 。所以这就是最接近你可以在浮点格式的范围内。)

这就是round(57.599999999999994, 2)返回的内容。

打印时,您使用的软件会忽略某些数字。它似乎是打印足够的数字来唯一地区分确切的值(知道浮点格式的人可以使用显示的数字来确定确切的值)但不足以完全显示确切的值。