首页 > 解决方案 > 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)

感谢您的回复。

标签: sqlingres

解决方案


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

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

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

因此,我怀疑这只是显示正常浮点不准确性的 ingres,并且该数据库中有已知的解决方法。

更新

这是来自 Actian 的一篇关于 ingres 浮点问题的支持文章,这似乎很有用:https ://communities.actian.com/s/article/Floating-Point-Numbers-Causes-of-Imprecision 。


推荐阅读