MySQLが浮動小数点に余分な数字を追加する理由

私には価格表があります。 各価格は、ドットの後に2桁のFLOATです。 何らかの理由から、IF式で価格を使用すると、結果は同じフロートで多くの追加数字が付きます。

mysql> select price, IF(1, price,0) as my_price from tbl_prices limit 10;
+-------+------------------+
| price | my_price         |
+-------+------------------+
| 79.95 | 79.9499969482422 |
| 99.95 | 99.9499969482422 |
| 89.95 | 89.9499969482422 |
| 89.95 | 89.9499969482422 |
| 79.95 | 79.9499969482422 |
| 89.95 | 89.9499969482422 |
| 89.95 | 89.9499969482422 |
| 79.95 | 79.9499969482422 |
| 79.95 | 79.9499969482422 |
| 69.95 | 69.9499969482422 |
+-------+------------------+
10 rows in set (0.00 sec)

ご覧のように、同じ価格を返すIF式の結果にはゴミが含まれていますが、価格は良好です。

だれかがこのゴミの理由を知っていますか?ROUNDを使わないでどうすれば取り除くことができますか?

前もって感謝します!

2

3 答え

ただしないでください。浮動小数点数は正確な値ではありません。たとえば、価格にDECIMALフィールドを使用します。

9
追加された
ありがとう、それは動作します!
追加された 著者 diemacht,
私はこれをもう一度。正確な10進値にはfloatを使用しないでください。その多くはバイナリで忠実に表現できません。 Decimalは正確なセマンティクスを持つ別のストレージメカニズムを使用することでこれを回避します。
追加された 著者 gahooa,

最初に、浮動小数点の使用方法を知っておく必要があります。

Fortunately MySQL provides DECIMAL data type, which can specify exact precision, for example:

DECIMAL( 10, 2)

小数点以下10桁の長い数字と2桁の数字を右側に格納します(例:

12345678.12
       1.03

等々。

2
追加された

.95浮動小数点で表現することはできません。これはあなたが得る最も近いものです。フロートがおおよその理由です。

正確な小数点以下桁数を使用する場合は、DECIMAL

2
追加された