使用PostgreSQL进行数字精确舍入工件

时间:2015-03-25 22:29:40

标签: postgresql odbc arbitrary-precision

我们有一个应用程序尝试批量插入postgresql中的表(9.1我认为,我无法访问帮助同事远程排除故障)。跟踪显示正确生成的原始值并正确传递给ODBC。

问题在于定义为NUMERIC但未定义比例或精度的列。似乎有随机的'舍入文物。有时会向上舍入,有时向下舍入,与小数位数无关。当查询批量插入的值时,可以看到这种情况。

我知道它可能导致字符串问题,但不确定数字数据类型是否重要。数据库是Windows 1252编码的,他们正在使用Unicode postgresql驱动程序。最后只是一些FYI它在32位Windows VM上看起来像默认的config_file参数。

问题是什么/可能是什么原因?

提前致谢。

1 个答案:

答案 0 :(得分:2)

数据类型numeric is an arbitrary precision data type,而不是float8double precision)或float4real)等浮点类型。即,它存储递送给它的十进制数字,而不进行任何舍入。数字的复制完全相同。只有确切的格式可能取决于您的区域设置或中间件和客户端的设置。

没有设置精度和比例这一事实让numeric列可以做到这一点几乎 1 没有限制。

1 Per documentaion:

  

小数点前最多131072位;小数点后最多16383位。

它的要点:您可以排除Postgres数据类型numeric作为舍入效果的来源。我不了解其余部分,特别是因为您没有提供准确的版本号,演示值或可重复的测试用例。
我在黑暗中的镜头是ODBC可能会将数字视为浮点类型。也许是一个过时的版本?