为什么选择SELECT 123456.123456789123456 FROM Dual;返回123456.123457?

时间:2010-07-13 14:31:45

标签: oracle

为什么SELECT 123456.123456789123456 FROM Dual;会返回123456.123457

如何提高这种精确度?

我问这个是因为我总结了定义为NUMBER(38,20)的成本值,我可以注意到错误已经累积,但由于这些数字代表金钱,所以四舍五入是不可接受的。

不仅我使用的工具会对数字显示进行舍入,但数字本身是四舍五入的,因为所做的报告也包含累积的错误。

2 个答案:

答案 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

如果您正在处理数据库之外的数字,那么可能会在那里累积错误。