提问人:Shashank V C 提问时间:5/19/2022 更新时间:5/19/2022 访问量:1083
将 2 个浮点值相加,得出具有更高精度的错误结果
Summation of 2 floating point values gives incorrect result with higher precision
问:
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) 的行为也是一样的。
答:
1赞
Abinash
5/19/2022
#1
根据 postgresql 文档,float 使用不精确的精度。最好使用 或 ,它支持用户指定的精确精度。DECIMAL
NUMERIC
SELECT CAST(669.05 AS numeric) + CAST(1.64 AS numeric)
数据类型 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:在这里试试
评论
float