我有一个简单的浮点列,当通过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)
或使用十进制列而不是浮点数来解决它,但我实际上想要了解这里发生的事情
答案 0 :(得分:3)
我认为@dasblinkenlight已经解释了表示的潜在问题。您的问题也与CASE
。
CASE
表达式返回单一类型。 MySQL必须在编译查询时决定类型。
您的CASE
组合了两种不同的类型:float
和int
。我相信这应该返回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来表示需要精确十进制表示的值,例如金额。