我必须修改一个表,该表的数据类型为varchar的双精度,成功执行了alter,但是数据发生了变化,而且我无法理解在双向转换时postgres的作用。 / p>
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时会发生什么?
答案 0 :(得分:3)
在运行将数据类型更改为ALTER TABLE
的{{1}}语句之前,请确保运行以下语句:
character varying
当将浮点数呈现为字符串时,这将导致PostgreSQL忽略不重要的十进制数字。
答案 1 :(得分:0)
根据Postgresql文档here Double Precision具有以下行为。
实数和双精度数据类型不精确, 可变精度数字类型。实际上,这些类型通常是 标准754的二进制浮点实现 算术运算(分别为单精度和双精度) 基础处理器,操作系统和编译器支持 它。
不精确表示某些值无法完全转换为 内部格式并将其存储为近似值,以便存储和 检索值可能会显示细微的差异。管理这些 错误及其在计算中的传播方式是 数学和计算机科学的整个分支,并且不会 除了以下几点外,这里讨论:
- 如果您需要精确的存储和计算(例如用于金额),请使用数字类型。
- 如果您想对任何重要的事情使用这些类型进行复杂的计算,尤其是如果您依赖于
中的某些行为 边界情况(无穷大,下溢),您应该评估
实施。- 比较两个浮点值是否相等可能并不总是按预期进行。
将双精度转换为数字,然后将该数字转换为varchar怎么办?