浮点不准确以防万一

时间:2016-09-02 13:37:31

标签: mysql sql

我有一个简单的浮点列,当通过CASE选择时,它不会产生正确的值:

SELECT my_column FROM my_table LIMIT 1;收益815.35
SELECT (CASE WHEN true THEN my_column ELSE 0 END) AS my_column FROM my_table LIMIT 1;收益率为815.3499755859375

问题显然来自案例和ELSE值(使用' test'而不是0按预期工作,但使用其他浮点数不是) 我可以使用ROUND(my_column,2)或使用十进制列而不是浮点数来解决它,但我实际上想要了解这里发生的事情

2 个答案:

答案 0 :(得分:3)

我认为@dasblinkenlight已经解释了表示的潜在问题。您的问题也与CASE

有关

CASE 表达式返回单一类型。 MySQL必须在编译查询时决定类型。

您的CASE组合了两种不同的类型:floatint。我相信这应该返回float值。

规则让我对为什么发生任何事情感到困惑;毕竟,浮动到浮动听起来像无操作。但是,浮点数有两种表示形式,4字节和8字节。我的猜测是你的列存储为4字节float。 SQL引擎决定CASE表达式应返回8字节double。转换为double是导致问题的原因。

事实上,this小SQLFiddle确认了这个猜测。问题是转换为双倍。

答案 1 :(得分:2)

815.35没有精确表示为IEEE-754 float。实际存储在float字段中的值是一个近似值,它取决于用于表示的位数。

使用单精度float时,该值变为815.3499755859375,这是您在运行查询时看到的内容。您可以计算使用IEEE-754计算器获得的表示(例如,this one)。

为了避免这样的表示差异,请使用decimal数据ty [e来表示需要精确十进制表示的值,例如金额。