希望有人可以帮忙!我们遇到Pervasive VAccess控件的问题,任何时候我们将“double”类型的项目保存到Pervasive数据库中,保存的值与我们想要的值不同...
举个例子,我们尝试保存 1.44 ,它实际上会保存 1.44004035454
略有差异,但仍有差异!
FYI DDF中定义的字段将十进制设置为0,我想知道一个操作过程是将其设置为例如4?但是我想在我们沿着这条路走下去之前,我会看到是否有人可以对它进行任何解释......
答案 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驱动程序希望它保持驱动程序设置它的方式,如果你改变它就会对你感到沮丧。
一般情况下,如果您想要一个人类可读的格式化数字,您应该使用round
或to_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公开从float8
到text
的演员版本,让您在每次通话的基础上指定extra_float_digits
。这通常更接近人们真正想要的。猜猜我应该补充说,如果我有时间......)