2016-06-29 18 views
1

私は奇妙な丸めの問題を抱えています。Mysql 5.5+の丸め誤差?

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; 

今すぐ "1.785" の3つのフィールドのそれぞれに入力します。ここでは

は、セットアップ(Mysqlの5.7 CEで同じMySQL5.5 Percona)です。

今、このクエリを実行します。ここでは

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

あなたは小数点以下1桁に丸める場合:この動作を説明してください rounding 1

誰か...

DECIMALフィールドでのみ正しいです。小数点以下3桁のみです。

答えて

2

:近似値番号について

、結果はCライブラリに依存します。多くのシステムでは、これはROUND()が「最も近い偶数に丸める」ルールを使用することを意味します。小数部分の値は最も近い偶数の整数に丸められます。

これは、浮動小数点数が最も近い偶数整数に丸められることを意味します。 DECIMAL数字は正確であるとみなされるので、0.5以上の小数部分は切り上げられます。

2

おそらく浮動小数点がコンピュータに保存され、完全に正確ではないためです(ベース2ではなく、ベース10に保存されているためです)。 1.785が1.784998として保存されている場合は、切り捨てられます。それが1.785001として保存された場合、それは切り上げられます。 MySQL Rounding Behaviourから