2017-11-07 4 views
0

MySQLの丸めの動作条件はhere.です。 Approximate(FLOAT、DOUBLE)値の丸めがHALF_EVENになると約束します。しかし、同じことをしようとすると、私はその文書で述べられたことを生み出すことができませんでした。 DOUBLEデータ型のHALF_UPとして明確に機能します。私はここに何もないのですか?あなたがあなたのリクエストをリンクされるドキュメントからMySQLの丸め動作が意図したとおりに動作しません..?

CREATE TABLE `doubleValues` (
    `val` double DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

select* from doubleValues; 
+-------+ 
| val | 
+-------+ 
| 1.245 | 
| 0.555 | 
+-------+ 

select round(val,2) from doubleValues; 
+--------------+ 
| round(val,2) | 
+--------------+ 
|   1.25 | 
|   0.56 | 
+--------------+ 
2 rows in set (0.00 sec) 
+0

あなたはおおよその数値ではなく、おおよその数値を使用していませんでした。また、[documentation](https://dev.mysql.com/doc/refman/5.7/en/precision-math-rounding.html)によれば、ラウンドハーフアップは基本となるCライブラリに依存することがあります。常に起こるとは限りません。 –

+0

@TimBiegeleisen "val"カラムにdoubleデータ型を使用しました。そして、MySQLのFLOATとDOUBLEによれば、数値データ型に近いものです。 ref:https://dev.mysql.com/doc/refman/5.5/en/floating-point-types.html –

+0

あなたは、以下のThorstenの答えをチェックして、二重について正しいです。丸め動作は定義されていません。 –

答えて

2

:近似値番号について

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

:丸め方法は未定義です。

とにかく:なぜ近似型を使うのですか?その数字が多い数字が必要ですか?私はそれがそうであるところでデータベースを想像することはほとんどできません。いくつかの天文データベースかもしれない。

+0

これは変更できないレガシーテーブルです。 : –

+0

与えられたシステムについて確実に知るために四捨五入の方法を知る方法はありますか? –

+0

列をDOUBLEからDECIMALに変更した場合、何が起こる可能性がありますか?丸め浮動小数点数については、これは偶然に任されています。1.245として表示されるものは1.2450001または1.2449999のいずれかとして格納されていて、それは擬似データの「魅力」です。 –

2

数字1.245および0.555は、2進浮動小数点では存在しません。彼らは正確に表現することはできません。 「1.245」と「0.555」と表示されているものは、1.24500000000000010658141036401502788066864013671875と0.55500000000000004884981308350688777863979339599609375と思われます。これらは、64ビットのバイナリIEEE-754浮動小数点で1.245と0.555に最も近い値です。 (これらは小数点以下では長すぎますが、2進数では短くなります)

これらを小数点以下2桁に四捨五入すると、四捨五入される必要がある部分が丸め位置で1/2をわずかに上回ります。最初は.500000000000010658141036401502788066864013671875で、2番目は.500000000000004884981308350688777863979339599609375です。したがって、ちょうど1/2の割合を四捨五入するときに何をすべきかについてのルールは作用しません。これらは両方とも1/2より上にあるので、切り上げられます。

関連する問題