昨天我帮助了一个人并得到了一个奇怪的错误,我无法向他解释它是如何工作的。
代码(在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
。
有人可以解释发生了什么吗?
答案 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);