varchar postgresql的双精度

时间:2019-04-16 01:39:09

标签: postgresql casting precision

我必须修改一个表,该表的数据类型为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时会发生什么?

2 个答案:

答案 0 :(得分:3)

在运行将数据类型更改为ALTER TABLE的{​​{1}}语句之前,请确保运行以下语句:

character varying

当将浮点数呈现为字符串时,这将导致PostgreSQL忽略不重要的十进制数字。

答案 1 :(得分:0)

根据Postgresql文档here Double Precision具有以下行为。

  

实数和双精度数据类型不精确,   可变精度数字类型。实际上,这些类型通常是   标准754的二进制浮点实现   算术运算(分别为单精度和双精度)   基础处理器,操作系统和编译器支持   它。

     

不精确表示某些值无法完全转换为   内部格式并将其存储为近似值,以便存储和   检索值可能会显示细微的差异。管理这些   错误及其在计算中的传播方式是   数学和计算机科学的整个分支,并且不会   除了以下几点外,这里讨论:

     
      
  • 如果您需要精确的存储和计算(例如用于金额),请使用数字类型。
  •   
  • 如果您想对任何重要的事情使用这些类型进行复杂的计算,尤其是如果您依赖于
    中的某些行为   边界情况(无穷大,下溢),您应该评估
      实施。
  •   
  • 比较两个浮点值是否相等可能并不总是按预期进行。
  •   

将双精度转换为数字,然后将该数字转换为varchar怎么办?