Sql 安格尔乘法给出了错误的结果

Sql 安格尔乘法给出了错误的结果,sql,ingres,Sql,Ingres,我有一个包含以下列的Ingres表 from_date ingresdate to_date ingresdate model_amt money 日期可以反映任意天数的期间,并且模型金额始终是每周数字。我需要计算该期间的总模型金额 要做到这一点,我需要知道这段时间涵盖了多少天,然后将model_amt除以7,再乘以天数 但是,我使用下面的代码得到了不正确的结果 select model_amt, date_part('day',b.to_date - b.from_date), model

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

from_date ingresdate
to_date ingresdate
model_amt money
日期可以反映任意天数的期间,并且模型金额始终是每周数字。我需要计算该期间的总模型金额

要做到这一点,我需要知道这段时间涵盖了多少天,然后将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_部分包含int4函数,都会出现同样的问题

*更新时间15:28*

解决方案是在模型amt周围添加一个float8函数

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

感谢您的回复。

在计算机中,浮点数是出了名的不准确。你可以对浮点数进行各种基本的数学计算,它们会减少几位小数

可以在这里找到一些信息;但它非常容易收集:)

通常,为了避免不准确,您需要使用特定于语言的功能(例如Java中的BigDecimal)来“完美地”存储小数。或者,您可以将小数表示为单独的整数(例如,主数字是一个整数,小数是另一个整数),然后将它们合并

所以,我怀疑这只是ingres显示了正常的浮点不准确度,并且在该数据库中有已知的解决方法

更新


这里有一篇来自Actian的支持文章专门介绍了ingres浮点问题,这似乎很有用:。

我对ingres SQL一无所知,但我的猜测是,您只是看到了浮点舍入错误的影响。如果使用区间函数而不是日期部分函数,我也会遇到同样的问题。我该怎么解决这个问题呢?我想这就是正在发生的事情:实际的
model\u amt
值不是
88.82
,而是在第一百位之后有更多的数字
88.82xxxx
,因此如果你真的把它们包括在你的计算中,你最终会得到
177.66
。所以,没有什么不对,但你的解释/期望是不正确的。