Ingres 乘法给出错误的结果
Ingres multiplication gives wrong result
我有一个 Ingres table 包含以下列
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)
感谢您的回复。
在计算机中,浮点数是出了名的不准确。您可以对浮点数进行各种基本数学计算,它们会相差几位小数。
一些信息可以在这里找到;但它非常适合 googleable :)。 http://effbot.org/pyfaq/why-are-floating-point-calculations-so-inaccurate.htm
通常为了避免不准确,您需要使用特定于语言的功能(例如 Java 中的 BigDecimal)来 "perfectly" 存储小数。或者,您可以将小数表示为单独的整数(例如,主数是一个整数,小数是另一个整数),然后再将它们组合起来。
因此,我怀疑这只是 ingres 显示了正常的浮点不准确,并且在该数据库中有已知的解决方法。
更新
这是一篇来自 Actian 的支持文章,专门关于 ingres 浮点问题,似乎很有用:https://communities.actian.com/s/article/Floating-Point-Numbers-Causes-of-Imprecision。
我有一个 Ingres table 包含以下列
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)
感谢您的回复。
在计算机中,浮点数是出了名的不准确。您可以对浮点数进行各种基本数学计算,它们会相差几位小数。
一些信息可以在这里找到;但它非常适合 googleable :)。 http://effbot.org/pyfaq/why-are-floating-point-calculations-so-inaccurate.htm
通常为了避免不准确,您需要使用特定于语言的功能(例如 Java 中的 BigDecimal)来 "perfectly" 存储小数。或者,您可以将小数表示为单独的整数(例如,主数是一个整数,小数是另一个整数),然后再将它们组合起来。
因此,我怀疑这只是 ingres 显示了正常的浮点不准确,并且在该数据库中有已知的解决方法。
更新
这是一篇来自 Actian 的支持文章,专门关于 ingres 浮点问题,似乎很有用:https://communities.actian.com/s/article/Floating-Point-Numbers-Causes-of-Imprecision。