“round”如何返回浮点数?
PHP 浮点类型是 IEEE-754 binary64。
数字 59.95 不能以二进制精确存储。在 IEEE-754 binary64 中, 的表示59.95应该是59.9500000000000028421709430404007434844970703125。
但是,当我这样做时
<?php
return 59.95
它返回 59.95。这怎么可能?
函数round 还声称将 val 的舍入值返回到指定精度作为浮点数。但这怎么可能呢?不存在59.95点后只有两位数的浮点表示。
回答
PHP 通过precisionini 设置控制浮点到字符串的精度。此值为14默认值。
如果您改为使用32或 其他任意更大的值,您将看到您要查找的内容:
> php -d "precision=32" -r "print(59.95);"
59.950000000000002842170943040401
^-- Default precision stops here
由于与“精确”值的差异发生在默认精度值之后,因此该值将按照您的预期打印:
> php -d "precision=14" -r "print(59.95);"
59.95