0

考虑在 nginx/php 7.0.33 上运行的 dockerized Laravel (5.7) 应用程序。

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

在此处输入图像描述

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

奖金:

在此处输入图像描述

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

在此处输入图像描述

4

2 回答 2

2

你会发现你的问题的最佳答案是计算机不能很好地处理浮点数。在内部,数字 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% 20 时,导致 %20 到 %20small%20roundoff%20errors

于 2021-01-11T17:02:49.033 回答
0

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

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

于 2021-01-11T16:56:51.813 回答