4

使用 Postgres 12.4 我发现 float8 到 decimal(24,8) 之间的舍入不一致

通过做

select 
  29314.630053404966::float8::decimal(24,8) as num1,
  29314.630053404966::decimal(24,8) as num2

回报是:

num1: 29314.63005341 -> wrong
num2: 29314.63005340 -> correct

如您所见,四舍五入无法正常工作

有什么方法可以正确地从 float8 转换为 decimal(24,8)?

4

1 回答 1

4

如果我想存储小数点值,我总是使用decimal而不是使用。float8

为什么?有一个例子

SELECT 0.1::decimal(24,8) + 0.2::decimal(24,8); --0.30000000

SELECT 0.1::float8 + 0.2::float8; --0.30000000000000004

我们可以看到0.1::float8 + 0.2::float8会得到错误的数字。

更多细节可以参考What Every Programmer Should Know About Floating-Point Arithmetic

有什么方法可以正确地从 float8 转换为 decimal(24,8)?

有一种方法可以帮助您做到这一点

我们可以先尝试将值转换为字符串,在转换float8为之前decimal(24,8)

select 
  29314.630053404966::float8::varchar(40)::decimal(24,8) as num1,
  29314.630053404966::decimal(24,8) as num2

这种方式可能有效,但这会导致性能问题。

sqlfiddle

于 2022-03-03T15:46:59.947 回答