我有一个简单的浮点列,通过 CASE
选择时不会产生正确的值:
SELECT my_column FROM my_table LIMIT 1;
yield 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)
来解决它,或者使用小数列而不是浮点列,但我实际上想了解这里发生的情况
最佳答案
我认为 @dasblinkenlight 已经解释了表示的根本问题。您的问题也与CASE
有关。
CASE
表达式返回单一类型。 MySQL 必须在编译查询时决定类型。
您的CASE
组合了两种不同的类型,float
和int
。我相信这应该返回一个 float
值。
这些规则让我有点困惑,不明白为什么会发生这样的事情;毕竟, float 到 float 听起来像是无操作。但是, float 有两种表示形式:4 字节和 8 字节。我的猜测是您的列存储为 4 字节 float
。 SQL 引擎决定 CASE
表达式应返回 8 字节的 double
。转换为 double
是导致问题的原因。
事实上,this小 SQLFiddle 证实了这个猜测。问题在于转换为 double 。
关于mysql - 浮点不准确的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39293822/