Pervasive VAccess控制v双数据类型

时间:2014-01-21 09:58:17

标签: pervasive

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

举个例子,我们尝试保存 1.44 ,它实际上会保存 1.44004035454

略有差异,但仍有差异!

FYI DDF中定义的字段将十进制设置为0,我想知道一个操作过程是将其设置为例如4?但是我想在我们沿着这条路走下去之前,我会看到是否有人可以对它进行任何解释......

1 个答案:

答案 0 :(得分:0)

潜在的影响与普遍无关,它是a simple floating point issue。在任何使用单精度或双精度浮点的系统中都会发现相同的情况,尽管有些系统会自动舍入以隐藏这一点。

请参阅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驱动程序希望它保持驱动程序设置它的方式,如果你改变它就会对你感到沮丧。

一般情况下,如果您想要一个人类可读的格式化数字,您应该使用roundto_char进行舍入,或者在客户端进行舍入。请注意,由于in answers to this question解释的原因,没有round(double precision, integer)功能。所以你可能想要to_char,例如

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

(我希望PostgreSQL公开从float8text的演员版本,让您在每次通话的基础上指定extra_float_digits。这通常更接近人们真正想要的。猜猜我应该补充说,如果我有时间......)