我们有一个设置,其中远程 C++ 客户端调用 Oracle 函数(使用 OCCI 库)传递一些数据。然后,此 Oracle 函数将数据插入到表中。传递给函数的数据之一是 AMOUNT,它是一个浮点数。
在 C++ 客户端中,这个 AMOUNT 变量被定义为“double”。Oracle 函数和表都将此列的数据类型定义为“NUMBER”(没有明确定义任何精度或小数位数)。
我们看到客户端发送的内容与我们在数据库中接收和存储的内容之间存在很多不一致。例如,客户声称他们传递了一个值“35.6”,但我们在表中看到的是“35.59999847”。
我们应该以最多 6 位小数的精度存储这些值。如果我将 AMOUNT 列的数据类型定义从 NUMBER 更改为 NUMBER(38,6),我得到“35.599998”。如果我将其更改为 NUMBER (38,5),我最终会得到“35.6”。
有人可以建议这里可能发生的事情吗?我知道不建议将金额或价格值视为浮点数,而应使用整数,但在这种情况下,我们无法控制 C++ 客户端。我们在非常大的数据集上看到了这个问题(超过 50% 的数据存在这个问题)。
此外,这个问题不仅限于浮点数。即使整数很大,我们也可以看到不一致(例如,作为 1000000000 传递的值被存储为 1000000004)。