我有一张价格表。 每个价格都是一个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)?
提前致谢!
答案 0 :(得分:9)
请不要。浮点数不是精确值。例如,使用DECIMAL字段作为价格。
答案 1 :(得分:2)
因为您无法在浮点数中表示.95。这是你最接近的。这就是浮动是近似的原因。
如果您想要精确的小数位,请使用DECIMAL
答案 2 :(得分:2)
首先,你应该知道floating point works。
的方式幸运的是,mysql提供了DECIMAL
数据类型,可以指定精确的精度,例如:
DECIMAL( 10, 2)
将在右侧存储10个小数位的长数字和2位数字,例如:
12345678.12
1.03
等等。