【发布时间】:2019-04-16 01:39:08
【问题描述】:
我必须将数据类型为双精度字段的表修改为 varchar,alter 已成功执行,但是数据发生了变化,我无法理解 postgres 在进行双向转换时做了什么。
Postgres 版本:PostgreSQL 10.4,由 Visual C++ build 1800 编译,64 位
ALTER TABLE my_table ALTER COLUMN field_double_precision TYPE varchar;
--After the change this is my problem, new value is very different to old value
id |old_value |new_value |
-------|-----------|-----------------------|
9009 |0.06 | 0.059999999999999998 |
9010 |0.56 | 0.56000000000000005 |
9011 |0.068 | 0.068000000000000005 |
9012 |0.568 | 0.56799999999999995 |
我知道数值是近似变化的,但我必须不惜一切代价避免这种情况。
我的测试:
SELECT CAST (0.059999999999999998 AS DOUBLE PRECISION) old_value;
old_value |
----------|
0.06 |
-----------------------------------------------------------------------
SELECT CAST (0.059999999999999998 AS double PRECISION)::VARCHAR new_value;
new_value |
---------------------|
0.059999999999999998 |
我可以保持我的旧值和新值相等吗?当 postgres 将双精度格式化为 varchar 时会发生什么?
【问题讨论】:
-
在 x86_64-apple-darwin17.5.0 上的 PostgreSQL 10.4 上,由 Apple LLVM 版本 9.1.0 (clang-902.0.39.1) 编译,64 位,你的最后一条语句给了我 0.06。
-
我无法在 10.7 中重现您的问题。粘贴重现您的问题的
create table和insert语句。 -
在 x86_64-pc-linux-gnu 上的 PostgreSQL 10.7 (Ubuntu 10.7-0ubuntu0.18.04.1),由 gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 编译,64 位,您的最后一条语句也给出了 0.06
select cast(0.059999999999999998 AS double PRECISION)::VARCHAR new_value -
在由 Visual C++ build 1800 编译的 Windows 10 PostgreSQL 10.7 上,64 位的最后一条语句也显示 0.06。
-
在第一种情况下,
psql正在格式化数字的显示。在第二种情况下,Postgres(服务器)在将数字转换为 varchar 之前对其进行格式化
标签: postgresql casting precision