0

希望有人能帮忙!我们遇到了 Pervasive VAccess 控件的问题,每当我们将“double”类型的项目保存到 Pervasive 数据库中时,保存的值都与我们想要的不同......

作为示例,我们尝试保存1.44,它实际上保存了1.44004035454

略有不同,但还是有区别的!

仅供参考,DDF 中定义的字段的十进制设置为 0,我想知道是否有一种做法是将其设置为例如 4?但是我想在我们沿着这条路走之前,我想看看是否有人能阐明它……

4

1 回答 1

0

潜在的影响与 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 驱动程序希望它保持驱动程序设置它的方式,如果你改变它,你会生气。

一般来说,如果您想要一个人类可读的格式化数字,您应该使用roundor进行舍入to_char,或者在客户端进行舍入。请注意,由于此问题的答案中round(double precision, integer)解释的原因,没有功能。所以你可能会想要,例如。to_char

regress=> SELECT to_char(FLOAT8 '1.44', 'MI999999999D99');
    to_char    
---------------
          1.44
(1 row)

(我希望 PostgreSQL 公开一个演员表版本,float8textextra_float_digits在每次调用的基础上指定。这通常更接近人们真正想要的。我想如果我有时间的话,我应该补充一下......)

于 2014-01-21T10:53:29.973 回答