为什么SELECT 123456.123456789123456 FROM Dual;
会返回123456.123457
?
如何提高这种精确度?
我问这个是因为我总结了定义为NUMBER(38,20)
的成本值,我可以注意到错误已经累积,但由于这些数字代表金钱,所以四舍五入是不可接受的。
不仅我使用的工具会对数字显示进行舍入,但数字本身是四舍五入的,因为所做的报告也包含累积的错误。
答案 0 :(得分:6)
嗯,事实并非如此。但正如您所说,显示结果的工具(例如SQL Plus)可以将其四舍五入以显示:
SQL> SELECT 123456.123456789123456 n from dual;
N
----------
123456.123
SQL> column n format 9999999999.99999999999999999999999999999
SQL> SELECT 123456.123456789123456 n from dual;
N
-----------------------------------------
123456.12345678912345600000000000000
这里,在我指定格式掩码之前,SQL Plus四舍五入到小数点后3位。
至于你的报告显然是对它总和的数据进行舍入,我们可能需要看一个SQL和输入/输出数据的例子。
答案 1 :(得分:2)
不,列的(38,20)定义不应影响数字:
SQL> create table test (x number(38,20));
Table created.
SQL> insert into test values (123456.123456789123456);
1 row created.
SQL> commit;
Commit complete.
SQL> select x - 123456.123456789123456 from test;
X-123456.123456789123456
------------------------
0
如果您正在处理数据库之外的数字,那么可能会在那里累积错误。