mysql - 浮点不准确的情况

标签 mysql sql

我有一个简单的浮点列,通过 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组合了两种不同的类型,floatint。我相信这应该返回一个 float 值。

这些规则让我有点困惑,不明白为什么会发生这样的事情;毕竟, float 到 float 听起来像是无操作。但是, float 有两种表示形式:4 字节和 8 字节。我的猜测是您的列存储为 4 字节 float。 SQL 引擎决定 CASE 表达式应返回 8 字节的 double。转换为 double 是导致问题的原因。

事实上,this小 SQLFiddle 证实了这个猜测。问题在于转换为 double 。

关于mysql - 浮点不准确的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39293822/

相关文章:

sql - 使用 XQuery 替换 SQL Server 中的 xml 命名空间前缀

php - 我的代码没有按预期工作

php - 又数日子

Mysql动态交叉表在一张表上进行透视比较

sql - SCOPE_IDENTITY() 的同步问题

sql - 在 PostgreSQL 中将列数据类型从文本更改为整数

php - 如何使用php中的复选框删除记录?

mysql - 具有多个条件的左连接表

sql - 从多个表中选择 COUNT(DISTINCT [name])

java - 如何获取通过 execSQL() 或 rawQuery() SQLite 调用的更新的受影响行?