有时,圆形数字返回为"0.999999999992345"

Dal*_*aen 4 mysql perl floating-accuracy

我有一份报告应该返回一些内容

SELECT brand, ROUND(SUM(count * price) / SUM(count), 2) 
    WHERE ... GROUP BY brand, ...; 
Run Code Online (Sandbox Code Playgroud)

问题是,我有时在我的perl代码中得到9990.32999999999992345而不是直接SQL请求返回的9990.33.

这个数字在fetchrow_hashref之后开始就是这样,如果有的话.在不同的查询中,相同的数字可以是"好"或"坏"形式,但在任何特定查询中总是以相同的方式.

我该如何追踪?

Dan*_*man 9

阅读有关浮点精度问题的所有内容:http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems


Sem*_*nen 7

正如mellamokb所说,你必须绕过你的浮点数.更重要的是,countprice可能意味着你正在计算的东西的价格.正如本页针对FLOAT和DOUBLE数据类型所解释的那样,计算是近似的,而对于DECIMAL,它们是精确的.对于你的特定例子,机会很低会带来问题,但如果你用你的计算机做很多计算就没有price.通常的规则是始终使用精确数据类型来计算价格.