观察以下情况
php -r 'echo 4.60*100, " ", (int)(4.60*100), PHP_EOL;'
令人惊讶的是(对我来说)它打印了这个:
460 459
我知道十进制 4.60 不能表示为有限的二进制数,但为什么
浏览 PHP 文档,我没有看到浮点格式或将浮点值转换为字符串的格式的严格规范。所以这个答案是为了说明所涉及的一般原则,而不是基于文档的严格规范。
IEEE-754“双精度”(binary64)格式通常用于浮点。在此格式中,最接近 4.6 的可表示值是 4.5999999999999996447286321199499070644378662109375。乘以 100 得到 459.99999999999994315658113919198513031005859375。
执行
echo
会强制从浮点类型转换为字符串。我在文档中没有找到任何具体说明如何执行此转换的内容,但一些实验表明,至少在一种实现中,它是按照 C 格式%.14g
进行转换的,即使用 14 位有效数字。将 459.99999999999994315658113919198513031005859375 四舍五入到 14 位有效数字得到 460 (“460.00000000000”),这就是显示的输出。
由于 PHP 没有严格指定,您可能会在不同的实现中看到不同的输出。