Postgres 中的真实值是浮点数据类型,存储在 4 个字节上,即 32 位。
你的价值,
0.00000000000000000000000000000000000000000009
无法精确表示为 32 位 IEEE 754 浮点数。您可以检查确切的值在这个计算器中
You cold try and use double precision (64bits) to store it, according to the calculator, that seems to be an exact representation. NOT TRUE Patricia showed that it was just the calculator rounding the value, even though explicitly asking it not to... Double would mean a bit more precision, but still no exact value, as this number is not representable using finite number of binary digits. (Thanks, Patricia, a lesson learnt (again): don't believe what you see on the Intertubez)
在正常情况下,您应该使用 NUMERIC(精度,小数位数)格式,它可以精确地存储数字以获取正确的值。
However,您要存储的值的范围似乎大于 postgres 允许的精确十进制表示(似乎是 30)。如果您不想进行计算,只需存储它们(我承认这不是很常见的情况),您可以尝试将它们存储为字符串...(但这很丑陋...)
EDIT
这个 to_char 问题似乎是已知错误...
Quote:
我对此的第一反应是 float8 值没有 57 位数字
的精度。如果您希望该格式字符串执行某些操作
有用,您应该将其应用于数字列而不是双精度列
精度一.
我们可能可以整合一些东西来使这个特殊案例发挥作用
就像你期待的那样,但总会有相似的
由于精度不存在而无法工作的情况。
快速浏览一下代码,您会得到“0”的原因。是它是
15 位数字后四舍五入,以确保不会打印垃圾。或许
对于值非常小的情况,它可能会更聪明一些
比1,但这不是一个简单的改变。
(从这里)
然而,我认为这是无可辩解的。恕我直言,双精度(准确地说是 IEEE754 64 位浮点)将始终有 ~15有效小数位,如果该值适合该类型...
推荐阅读:
- 每个计算机科学家都应该了解的浮点运算知识
- Postgres 数字类型
- BUG #6217:to_char() 对于非常小的浮点值给出错误的输出