Mysql 5.5+中的舍入错误?

时间:2016-06-29 14:41:31

标签: mysql rounding

我有一个奇怪的舍入问题。

这是设置(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

以下是结果: rounding 2

如果你舍入到小数点后一位: rounding 1

有人请解释一下这种行为......

只有在DECIMAL字段中才有效,即使只有3位小数。

2 个答案:

答案 0 :(得分:2)

这可能是由于浮点数保存在计算机上的方式,不完全准确(由于保存在基数2,而不是基数10)。如果1.785保存为1.784998,它将向下舍入。如果它保存为1.785001,它将会向上舍入。

答案 1 :(得分:2)

来自MySQL Rounding Behaviour

  

对于近似值数字,结果取决于C库。在许多系统上,这意味着ROUND()使用“round to nearest even”规则:任何小数部分的值都舍入到最接近的偶数。

这意味着浮点数可以舍入到最接近的偶数整数。 DECIMAL数字被认为是精确的,因此0.5或更多的小数部分被四舍五入。