Ingres乘法给出错误的结果

时间:2018-08-29 14:10:36

标签: sql ingres

我有一个包含以下各列的Ingres表

from_date ingresdate
to_date ingresdate
model_amt money

日期可以反映任意天数,并且model_amt始终是每周的数字。我需要计算出该期间的总model_amt

要做到这一点,我需要知道该期间涵盖了多少天,然后将model_amt除以7,再乘以天数

但是,使用下面的代码我得到的结果不正确

select model_amt, date_part('day',b.to_date - b.from_date), 
model_amt / 7 * int4( (date_part('day',b.to_date - b.from_date)) )
from table

例如,在model_amt = 88.82且期限为2周的情况下,我得到以下输出

+-------------------------------------------------------+
¦model_amt           ¦col2         ¦col3                ¦
+--------------------+-------------+--------------------¦
¦              #88.82¦           14¦             #177.66¦
+-------------------------------------------------------+

但是88.82 / 7 * 14 = 177.64,而不是177.66?

有什么想法吗?无论是否在date_part周围包括int4函数,都会发生相同的问题。

*更新15:28 *

解决方案是在model_amt周围添加float8函数

float8(model_amt)/ 7 * interval('days', to_date - from_date)

感谢您的答复。

1 个答案:

答案 0 :(得分:1)

在计算机中,众所周知,浮点数不准确。您可以对浮点数乘以进行各种基本的数学计算,它们将以小数点后移。

一些信息可以在这里找到;但它非常谷歌:)。 http://effbot.org/pyfaq/why-are-floating-point-calculations-so-inaccurate.htm

通常为避免错误,您需要使用特定于语言的功能(例如Java中的BigDecimal)来“完美”存储小数。另外,您可以将小数表示为单独的整数(例如,主数字是一个整数,而小数是另一个整数),然后再将它们组合起来。

因此,我怀疑这只是显示正常的浮点错误而已,并且该数据库中存在已知的解决方法。

更新

这是Actian的一篇支持文章,专门介绍ingres浮点问题,该文章似乎很有用:https://communities.actian.com/s/article/Floating-Point-Numbers-Causes-of-Imprecision