PHP 7.0 - 四舍五入 and/or 将 float 转换为 int 会给出不正确的值

PHP 7.0 - rounding and/or casting float to int gives incorrect values

考虑在 nginx/php 7.0.33.

上 Laravel (5.7) 应用 运行

我遇到奇怪的舍入(?)错误:

谁能解释一下 floor($x) 是 7256 而不是 7257?

奖金:

奖励 2:PHP 7.4 / 8 中的相同测试给出了良好的结果:

Floor 向下舍入到它的底部,ceil 将根据函数名称提高该值。回合确定非此即彼 (iirc)

所以在你的例子中,99.9 floored 就是 99 而 ceil 就是 100

您的问题的最佳答案是计算机不能很好地处理浮点数。在内部,数字 72.57 实际上计算为 72.569999999999999999999,在大多数情况下可以计算,但会导致你 运行 变成你 运行 的结果,如果你乘以 100 (7256.999999999999) 然后使用 FLOOR,你得到 7256.

关于计算机在处理浮点数方面的问题有整篇文章,但是当精度很重要时,最好的解决方案是尽可能避免使用小数点右边的数字。

这篇文章讨论了 Python 中的问题,但它适用于所有语言:https://www.geeksforgeeks.org/floating-point-error-in-python/#:~:text=It's%20a%20problem%20caused%20when,leads%20to%20small%20roundoff%20errors