mysql,ceil(451 x 1.0 / 30)=15, ceil(451 x 1.00 / 30)=16,为什么?
我想知道为什么会发生这种情况。我该如何解决它?
这与浮点数的参数化有关吗?结果是 451*1.0 = 451,一个整数,而不是 451.0
上面的问题是在云服务器上,但是我在本地mysql容器(版本8.0)中运行上面2条语句,结果是16。所以我想知道是否数据库设置有问题?
更正:上面的语句是通过presto执行的
SET @value = 1.0;
SELECT CEIL(451 * @value / 30); -- Outputs: 15
SET @value = 1.00;
SELECT CEIL(451 * @value / 30); -- Outputs: 16
输出的差异是由于浮点数以二进制格式存储和操作的方式造成的。十进制值 1.0 和 1.00 的二进制表示略有不同,这导致计算结果存在微小差异。
要解决此问题,您可以更改计算以使用整数除法,这将为您提供输入参数的整数:
SELECT CEIL((451 *10) / 30); -- Outputs: 15
在这种情况下,1.0 和 1.00 在乘法过程中都转换为整数,导致计算中使用相同的值。这将为您提供一致的 CEIL 函数结果。
请注意,使用整数除法(// 而不是 /)也将通过对结果进行舍入而不是使用浮点精度来提供一致的结果。然而,对于
CEIL
函数,当前使用整数乘法的方法应该足够了。