Php 浮点到整数错误

Php 浮点到整数错误,php,casting,int,Php,Casting,Int,昨天我在帮助一个人时,犯了一个奇怪的错误,我无法向他解释它是如何工作的 代码(在3台机器(PHP5.3和PHP5.4)上测试) 怀疑的是int值将是6535,但它最终是6534 有人能解释一下发生了什么吗?用round代替int round($total) 第一次手术后,你实际上没有65.35 >>> '%.20f' % (65.351 - 0.001,) '65.34999999999999431566' 首先从适当缩放的整数值开始,不要尝试将该值转换为整数,或者在获取整

昨天我在帮助一个人时,犯了一个奇怪的错误,我无法向他解释它是如何工作的

代码(在3台机器(PHP5.3和PHP5.4)上测试)

怀疑的是int值将是
6535
,但它最终是
6534


有人能解释一下发生了什么吗?

round
代替
int

round($total)

第一次手术后,你实际上没有65.35

>>> '%.20f' % (65.351 - 0.001,)
'65.34999999999999431566'
首先从适当缩放的整数值开始,不要尝试将该值转换为整数,或者在获取整数值之前添加一个小值。

这与如何(阅读此链接中的警告!)将值存储在内存中有关。实际上,在第一次操作之后,您没有精确的十进制值,而是四舍五入的值。大概是65.3499999左右。(该值存储为位列表(0/1))

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

这就是为什么在谈到钱时,开发者不存储美元/欧元,而是存储美分的数量。通过这种方式,他们避免使用小数精度较低的浮点数,而是使用精度较高的整数。

没错,这是解决方案,但不是我想要的,因为我在寻找原因,而不是如何至少尝试解释一下你的意思
$r=$explode('.',$total);
debug($r);