不完全是答案,只是一个测试。
火鸟 2.1.7、IBExpert、SQL 方言 3
create table t58096187 (
f1 numeric(10,4),
f2 numeric(10,4),
f3 numeric(10,4),
f4 numeric(10,4)
);
insert into t58096187 values ( 50, 50, 50, 50 );
select
coalesce(F1, 0) * coalesce(F2, 0) * ((100 - coalesce(F3, 0)) / 100) * ((100 + coalesce(F4, 0)) / 100)
from t58096187;
错误:执行不成功...整数溢出...导致结果的最高有效位进位
•Dialect 3 数据库允许在精度大于 9 时将数字(DECIMAL 和 NUMERIC 数据类型)存储为 INT64
与Numeric(9,4) 相同的错误应该避免使用int64 内部数据类型。
如果我将字段声明为 float,select 会产生结果 1875,这完全在 Numeric(10,4) 数据类型内。
也许某些中间结果导致反向抛光超出范围?
如果要避免使用 INT64,这也可以使用
recreate table t58096187 (
f1 numeric(6,2),
f2 numeric(6,2),
f3 numeric(6,2),
f4 numeric(6,2)
)
Firebird 3.0.5 似乎也受到了影响 - https://dbfiddle.uk/?rdbms=firebird_3.0&fiddle=57729b31e0a5019aea68a136638d9f50
没有错误 - 但也没有结果!
Numeric-as-Int32 有效:https://dbfiddle.uk/?rdbms=firebird_3.0&fiddle=c4a4230e855b0ce4fd2b0c7b3b697cda
报告为https://www.sql.ru/forum/1317439-a/
Mark 对小数部分精度的假设可能是正确的。
recreate table t58096187 (
f1 numeric(10,4),
f2 numeric(10,4),
f3 numeric(10,4),
f4 numeric(10,3)
)
仍然有效。
https://dbfiddle.uk/?rdbms=firebird_3.0&fiddle=29a6c15d6e1854be230d29aea30307cf
Coalesce 似乎与我的问题无关,不知道它是否与主题启动者的问题有关,因为他所说的“删除coalesce”的意思是模棱两可的。在我删除coalesce 之后,它变成了这样
select
F1 * F2 * F3 * F4
from t58096187
很可能是同样的错误
https://dbfiddle.uk/?rdbms=firebird_3.0&fiddle=1f29aff4102ace57e8fa27d83e59b93f