我有一个奇怪的舍入问题。
这是设置(MySQL5.5 Percona;在Mysql 5.7 CE中相同):
CREATE TABLE `roundingtest` (
`RT_Double` DOUBLE NULL DEFAULT NULL,
`RT_Float` FLOAT NULL DEFAULT NULL,
`RT_Decimal` DECIMAL(10,3) NULL DEFAULT NULL
)
ENGINE=InnoDB;
现在输入3个字段“1.785”中的每个字段。
现在执行此查询:
SELECT
1.785, ROUND(1.785, 2),
RT_Double, ROUND(RT_Double, 2),
RT_Float, ROUND(RT_Float, 2),
RT_Decimal, ROUND(RT_Decimal, 2)
FROM roundingtest
有人请解释一下这种行为......
只有在DECIMAL字段中才有效,即使只有3位小数。
答案 0 :(得分:2)
这可能是由于浮点数保存在计算机上的方式,不完全准确(由于保存在基数2,而不是基数10)。如果1.785保存为1.784998,它将向下舍入。如果它保存为1.785001,它将会向上舍入。
答案 1 :(得分:2)
对于近似值数字,结果取决于C库。在许多系统上,这意味着ROUND()使用“round to nearest even”规则:任何小数部分的值都舍入到最接近的偶数。
这意味着浮点数可以舍入到最接近的偶数整数。 DECIMAL
数字被认为是精确的,因此0.5或更多的小数部分被四舍五入。