MySQL乘以浮点列:1*7.6给出7.599999904632568?

MySQL Multiplying float columns: 1*7.6 gives 7.599999904632568?

提问人: 提问时间:10/15/2015 最后编辑:Martin 更新时间:10/15/2015 访问量:5671

问:

当我进行查询时,它让我感到震惊SELECT 1*7.67.6

但是当我进行列乘法(products.commision*sold.amount)时:

SELECT *,
(products.commision*sold.amount) as fee
FROM sold
RIGHT JOIN products
ON sold.idprod=products.ID
AND DATE(sold.date) BETWEEN DATE('2015-10-01') AND DATE('2015-10-31')
WHERE sold.userid="1"
ORDER BY sold.userid

它让我大吃一惊

ID | userid | date     | idprod | amount | Category | Name  | commision  | fee
60 | 1      | 15-10-01 | 21     | 1      | Volish   | Black | 7.6(float) | 7.599999904632568

为什么?

MySQL 浮点精度 乘法

评论

3赞 Edward 10/15/2015
您正在使用浮点列。Decimal(19,6) 可能就是你要找的......
0赞 Mr. Llama 10/15/2015
可能是因为 isn't 完全或不完全是 ,但任何一个值本身都足够接近,可以显示为这样。浮点数很棘手。products.commission1sold.amount7.6
0赞 10/15/2015
@Edward我不明白?
0赞 Strawberry 10/15/2015
一般来说,钱是十进制的,而不是浮动的
0赞 10/15/2015
@Mr.Llama 它正好是 1 和 7.6,我必须准确

答:

0赞 user5306544 10/15/2015 #1

感谢您在评论中的帮助,

溶液

Float 是二进制的,decimal 是......decimal,所以我将我的列更改为 decimal(16,9)

3赞 Martin 10/15/2015 #2

在进行比较时,您必须将值类型转换为整数/小数,而不是浮点数

(CAST(products.commision AS Decimal(7,2)) * CAST(sold.amount AS Decimal(7,2))) as fee

https://dev.mysql.com/doc/refman/5.0/en/cast-functions.html 并在 MySQL 中将浮点数转换为十进制

小数点将值设置为小数点,其中 7 位数字为最大大小,2 位数字为最大精度 (12345.67)

编辑:我不确定将 CAST 添加到原始值或简单地转换答案(例如

(products.commision  * sold.amount ) as CAST(fee AS Decimal(7,2))

评论

0赞 Martin 10/15/2015
更改列类型可能是最好的整体策略,但如果这是一个孤立的问题,则可以在查询中更改这些内容。
0赞 10/15/2015
还有一个问题,如果我有 17,56,那就是 17,56,但是当我有 18,00 时,我只想要 18。我该怎么做?
0赞 Martin 10/15/2015
你在哪里说?这些数字在SQL查询中或数据库中的什么位置?
0赞 10/15/2015
如果我有佣金=我希望它是7.007
1赞 Martin 10/15/2015
对于所有意图和目的,正好等于 ,如果您将值输出到浏览器,那么您可以进行一些清理以删除多余的零。stackoverflow.com/questions/5149129/......7.007