2016-06-29 4 views
1

У меня возникла странная проблема округления.Ошибка округления в Mysql 5.5+?

Вот установка (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, даже с тремя знаками после запятой.

ответ

2

От MySQL Rounding Behaviour:

Для чисел приближенного-значения, результат зависит от библиотеки C. Во многих системах это означает, что ROUND() использует правило «округление до ближайшего четного»: значение с любой дробной частью округляется до ближайшего четного целого.

Это означает, что числа с плавающей запятой могут быть округлены до ближайшего четного целого числа. DECIMAL номера считаются точными, поэтому округляются частичные части 0,5 или более.

2

Возможно, это связано с тем, что плавающие точки сохраняются на компьютере, а не полностью точно (из-за сохранения в базе 2, а не в базе 10). Если 1.785 сохранено как 1.784998, оно округляется вниз. Если он будет сохранен как 1.785001, он будет округлен.