希望有人能帮忙!我们遇到了 Pervasive VAccess 控件的问题,每当我们将“double”类型的项目保存到 Pervasive 数据库中时,保存的值都与我们想要的不同......
作为示例,我们尝试保存1.44,它实际上保存了1.44004035454
略有不同,但还是有区别的!
仅供参考,DDF 中定义的字段的十进制设置为 0,我想知道是否有一种做法是将其设置为例如 4?但是我想在我们沿着这条路走之前,我想看看是否有人能阐明它……
希望有人能帮忙!我们遇到了 Pervasive VAccess 控件的问题,每当我们将“double”类型的项目保存到 Pervasive 数据库中时,保存的值都与我们想要的不同......
作为示例,我们尝试保存1.44,它实际上保存了1.44004035454
略有不同,但还是有区别的!
仅供参考,DDF 中定义的字段的十进制设置为 0,我想知道是否有一种做法是将其设置为例如 4?但是我想在我们沿着这条路走之前,我想看看是否有人能阐明它……
潜在的影响与 pervasive 无关,它是一个简单的浮点问题。您会在任何使用单精度或双精度浮点的系统中发现相同的情况,尽管有些系统会自动舍入以向您隐藏这一点。
见http://en.wikipedia.org/wiki/Floating_point
对于 PostgreSQL 及其衍生产品,您可以设置extra_float_digits
来控制此舍入。
regress=> SET extra_float_digits = 3;
SET
regress=> SELECT FLOAT8 '1.44';
float8
---------------------
1.43999999999999995
(1 row)
regress=> SET extra_float_digits = 0;
SET
regress=> SELECT FLOAT8 '1.44';
float8
--------
1.44
(1 row)
它默认为 0,但您的客户端驱动程序可能正在更改它。如果你使用的是 JDBC(我猜你是),那么不要乱用这个设置,JDBC 驱动程序希望它保持驱动程序设置它的方式,如果你改变它,你会生气。
一般来说,如果您想要一个人类可读的格式化数字,您应该使用round
or进行舍入to_char
,或者在客户端进行舍入。请注意,由于此问题的答案中round(double precision, integer)
解释的原因,没有功能。所以你可能会想要,例如。to_char
regress=> SELECT to_char(FLOAT8 '1.44', 'MI999999999D99');
to_char
---------------
1.44
(1 row)
(我希望 PostgreSQL 公开一个演员表版本,float8
让text
您extra_float_digits
在每次调用的基础上指定。这通常更接近人们真正想要的。我想如果我有时间的话,我应该补充一下......)