intval()函数实际功能是什么?为何浮点运算后转换结果异常?
问题
如下PHP代码示例中,将浮点运算得到的数值通过intval()转换为整数时,结果为int(43647)而非预期的int(43648):
$f = (float)"43.650" - 0.002; var_dump($f); var_dump($f*1000); var_dump(intval($f*1000));
输出结果:
float(43.648) float(43648) int(43647)
请问这一现象的原因是什么?
原因分析
这是浮点数的精度特性导致的,PHP使用的是IEEE 754标准的双精度浮点数,这类浮点数无法精确表示所有十进制小数。
- 看似是
43.648的浮点数,在计算机内存里实际存储的是一个略小于43.648的近似值(比如43.647999999999996)。 - 把这个近似值乘以1000后,得到的是一个略小于
43648的数(比如43647.99999999996)。 intval()函数的逻辑是直接截断小数部分,只保留整数部分,所以这个略小于43648的数会被截断为43647。
而var_dump()输出浮点数时会做四舍五入处理,所以你看到的是float(43.648)和float(43648),但这并不是它在内存中的真实值。
内容的提问来源于stack exchange,提问作者Michael Kelso
相关产品推荐
相关产品推荐

