【问题标题】:MySQL Multiplying float columns: 1*7.6 gives 7.599999904632568?MySQL乘以浮点列:1 * 7.6给出7.599999904632568?
【发布时间】:2016-01-12 21:11:24
【问题描述】:

当我查询 SELECT 1*7.6 时,它给了我 7.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

为什么?

【问题讨论】:

  • 您正在使用浮动列。 Decimal(19,6) 可能是您正在寻找的......
  • 可能是因为products.commission 不完全是1sold.amount 不完全是7.6,但它本身的任何一个值都足够接近,可以这样显示。浮点数很棘手。
  • @Edward 我不明白?
  • 一般来说,money 是 DECIMAL,而不是 FLOAT
  • @Mr.Llama 正好是 1 和 7.6,我必须准确

标签: mysql floating-accuracy multiplication


【解决方案1】:

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

(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.htmlcasting a floating to decimal in mysql

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

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

)是否更有效
(products.commision  * sold.amount ) as CAST(fee AS Decimal(7,2))

【讨论】:

  • 更改列类型可能是最好的整体策略,但如果这是一个孤立的问题,您可以在查询中更改这些内容。
  • 还有一个问题,如果我有 17,56 就是 17,56,但是当我有 18,00 时,我只想要 18。我该怎么做?
  • 你在说什么?这些数字在哪里,在 SQL 查询中,在数据库中,还是?
  • 如果我有佣金 = 7.00 我希望它是 7
  • 出于所有意图和目的7.00 完全等于7,如果您将值输出到浏览器,那么您可以进行一些清理以删除多余的零。 stackoverflow.com/questions/5149129/…
【解决方案2】:

感谢cmets的帮助,

解决方案

浮点数是二进制,十进制是...十进制,所以我将列更改为十进制(16,9)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 2014-07-26
    • 1970-01-01
    • 2014-02-14
    • 2021-05-29
    相关资源
    最近更新 更多