mysql - 为什么 MySQL round floats 比预期的要多?

标签 mysql floating-point-precision

UPDATE some_table SET some_float_field=1919.987 WHERE id=123

SELECT * FROM some_table WHERE id=123

其中 some_float_field 是定义为“float”(没有任何特定大小值)的字段。

预期结果值为 1919.987;相反,它四舍五入为 1919.99

为什么? 32 位(单精度) float 具有足够的精度来正确存储它!

最佳答案

当您运行查询时:

SELECT * FROM some_table WHERE id = 123

您依靠用户界面来格式化 float 。您正在使用的界面使用两个字符而不是更多。毕竟,没有关于“正确”数字的信息可以显示。

您可以通过将数字格式化为字符串或小数来说服界面显示正确的数字。例如:

select format(some_float_field, 3)

会将其转换为具有三位小数的字符串。一个警告:它还会添加您可能不想要的逗号。这也应该有效:

select cast(some_float_field as decimal(8, 3))

请注意,您可以通过执行以下操作轻松验证数据是否正确:

select *
from some_table
where some_float_field between 1919.987 - 0.0001 and 1919.987 + 0.0001;

请注意,您不想对浮点值使用 =,但您已经了解这一点。

关于mysql - 为什么 MySQL round floats 比预期的要多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23120584/

相关文章:

ruby - 如何在 ruby​​ 中从 0.0001 计数到 1?

java - float 的位模式是有序的吗?

mysql - 对 MySQL 查询进行排序,忽略大小写

C++:将 "boost::multiprecision::float128"转换为 "double"

C++如何避免浮点运算错误

javascript - 将对下拉框的更改保存到 CakePHP 中的数据库中

java - Random.nextDouble 数学错误

c# - 如何使用 C# 复制 MySql 数据库架构?

MySQL 使用连接进行不同搜索

php - 2 表查询正确协议(protocol)