2012-02-06 6 views
2

У меня есть таблица цен. Каждая цена представляет собой FLOAT с двумя цифрами после точки. Из какой-то причины, когда я использую цену в выражении IF, результат тот же поплавок со многими дополнительными цифрами:Почему MySQL добавляет дополнительные цифры к плавающим?

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)?

Заранее благодарен!

ответ

9

Просто нет. Поплавок не является точным значением. Используйте поля DECIMAL, например, по цене.

+0

I второй этот. НЕ используйте float для точных десятичных значений, так как многие из них не могут быть точно представлены в двоичном формате. Decimal работает вокруг этого, используя другой механизм хранения с точной семантикой. – gahooa

+0

Спасибо, много работает! – diemacht

2

Потому что вы не можете представлять .95 в плавающей запятой. Это самое близкое, что вы получите. Вот почему float является приблизительным.

Если вы хотите точно знаков после запятой, используйте DECIMAL

2

Сначала вы должны знать, как в floating point works.

К счастью MySQL обеспечивает тип DECIMAL данных, которые могут указать точную точность, например:

DECIMAL(10, 2) 

будет хранить 10 знаков после запятой длинного числа и 2 цифры из этого на правой стороне, например:

12345678.12 
     1.03 

и так далее.

Смежные вопросы