为什么MySQL为浮点数增加了额外的数字?

时间:2012-02-06 13:27:03

标签: mysql

我有一张价格表。 每个价格都是一个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)?

提前致谢!

3 个答案:

答案 0 :(得分:9)

请不要。浮点数不是精确值。例如,使用DECIMAL字段作为价格。

答案 1 :(得分:2)

因为您无法在浮点数中表示.95。这是你最接近的。这就是浮动是近似的原因。

如果您想要精确的小数位,请使用DECIMAL

答案 2 :(得分:2)

首先,你应该知道floating point works

的方式

幸运的是,mysql提供了DECIMAL数据类型,可以指定精确的精度,例如:

DECIMAL( 10, 2)

将在右侧存储10个小数位的长数字和2位数字,例如:

12345678.12
       1.03

等等。