首页 > 解决方案 > Postgres 在将小数部分中的第一个数字 <= 1 的大浮点数转换为实际 dtype 时消除了小数精度

问题描述

如果您将足够大的具有小数精度的数字转换为数,其中小数部分中的第一个数字小于或等于 1,则小数部分将被消除。

-- decimal precision is captured

-- 3 x 10^5 + 0.1
select 300000.1::real

OUTPUT:
300000.1
-- decimal precision is not captured

-- 3 x 10^6 + 0.1
select 3000000.1::real

OUTPUT:
3000000
-- decimal precision is captured

-- 3 x 10^6 + 0.2
select 3000000.2::real

OUTPUT:
3000000.2

我检查了 Postgres 文档,发现真正的dtype 是“可变精度,不精确”,范围为“6 个十进制数字精度”。我不确定为什么在第三个示例中捕获小数精度而不是第二个示例,因为数字的大小是相同的,只是一个更大的小数部分。有人可以解释一下吗?

标签: sqlpostgresql

解决方案


这只是一个巧合。

real以二进制形式存储,因此当您超过精度时,该值与预期的十进制数相差多远取决于抽签的运气。


推荐阅读