将 2 个浮点值相加,得出具有更高精度的错误结果

Summation of 2 floating point values gives incorrect result with higher precision

提问人:Shashank V C 提问时间:5/19/2022 更新时间:5/19/2022 访问量:1083

问:

postgres 中 2 个浮点值的总和给出了更高精度的结果。预期:

669.05 + 1.64 = 670.69

实际:

SELECT CAST(669.05 AS FLOAT) + CAST(1.64 AS FLOAT)
------------------
670.6899999999999

结果是精度高于预期。

使用不同输入集的相同操作的行为不同。

SELECT CAST(669.05 AS FLOAT) + CAST(1.63 AS FLOAT)
------------------
670.68

在这里,我通过查找存在问题的 2 个数字来减少问题陈述。 实际问题是,当我在整个表上执行此操作时,结果会非常大,精度更高(取决于值,我没有解释精度到底是多少/类型的值),我们必须在应用程序级别处理比例。 示例查询

SELECT numeric_column_1/ CAST(numeric_column_2 AS FLOAT) FROM input_table;

注意:FLOAT(53) 的行为也是一样的。

SQL PostgreSQL 强制转换 浮点

评论

1赞 Belayer 5/19/2022
这是因为十进制值(以 10 为基数)不能用二进制(以 2 为基数)精确表示。请参阅文档数值类型:浮点类型。因此,数据类型始终是近似值。最好的办法是将精度限制在小数点后 6 位。float

答:

1赞 Abinash 5/19/2022 #1

根据 postgresql 文档,float 使用不精确的精度。最好使用 或 ,它支持用户指定的精确精度。DECIMALNUMERIC

SELECT CAST(669.05 AS numeric) + CAST(1.64 AS numeric)

PostgreSQL 中的浮点类型

数据类型 real 和 double precision 是不精确的, 精度可变数值类型。在当前支持的所有设备上 平台,这些类型是 IEEE 标准 754 的实现,用于 二进制浮点运算(单精度和双精度, 分别),在一定程度上,底层处理器,操作 系统和编译器支持它。

数值类型

名字 存储大小 描述 范围
小英特 2 字节 小范围整数 -32768 至 +32767
整数 4 字节 整数的典型选择 -2147483648 至 +2147483647
bigint 8 字节 大范围整数 -9223372036854775808 至 +9223372036854775807
十进制 变量 用户指定的精度、精确度 小数点前最多 131072 位;小数点后最多 16383 位数字
数值的 变量 用户指定的精度、精确度 小数点前最多 131072 位;小数点后最多 16383 位数字
真正 4 字节 精度可变,不精确 精度为6位十进制数字
双精度 8 字节 精度可变,不精确 15 位十进制精度
小串口 2 字节 小的自动递增整数 1 到 32767
串行 4 字节 自动递增整数 1 至 2147483647
大串口 8 字节 大自动递增整数 1 至 9223372036854775807

DB Fiddle:在这里试试