浮点到int错误

时间:2013-11-26 09:55:27

标签: php casting int

昨天我帮助了一个人并得到了一个奇怪的错误,我无法向他解释它是如何工作的。

代码(在3台机器上测试(PHP 5.3和PHP 5.4))

// (float)65.35
$percentage = round(65.351, 2);
// (float) 6535
$total = $percentage * 100;
// (int) 6534
$int = (int) $total;

可疑的是,int值为6535,但最终为6534

有人可以解释发生了什么吗?

4 个答案:

答案 0 :(得分:6)

第一次操作后你实际上没有65.35。

>>> '%.20f' % (65.351 - 0.001,)
'65.34999999999999431566'

首先从一个适当缩放的积分值开始,不要尝试将值转换为整数,或者在取整数值之前添加一个小值。

答案 1 :(得分:3)

这与floating point(读取此链接中的警告!)值如何存储在内存中有关。实际上,在第一次操作之后,您没有精确的十进制值,而是一个舍入值。可能是65.34999999左右。 (该值存储为位列表(0/1))

这就是为什么在谈论金钱时,开发商不会存储美元/欧元,而是存储美分金额。通过这种方式,它们可以避免使用精度较低的浮点数,而是使用精确的整数。

答案 2 :(得分:2)

使用round代替int

round($total)

答案 3 :(得分:0)

$r=$explode('.',$total);
debug($r);