存储过程和命令窗口得到的结果不一致

[复制链接]
查看11 | 回复3 | 2014-9-10 21:37:07 | 显示全部楼层 |阅读模式
从存储过程和命令窗口得到的结果为什么不一致呢?
[php]
SQL> create or replace procedure p_test(p_bin number) is
2l_log number;
3begin
4
5select log(2, p_bin) into l_log from dual;
6dbms_output.put_line(l_log);
7end p_test;
8/
Procedure created
SQL> exec p_test(4096)
11.99999999999999999999999999999999999994
PL/SQL procedure successfully completed
SQL> select log(2, 4096)from dual;
LOG(2,4096)
-----------
12
.
[/php]
在9i和10g都试过了,结果都不一致。
为什么呢?
回复

使用道具 举报

千问 | 2014-9-10 21:37:07 | 显示全部楼层
问题处在 dbms_output
rollingpig@test> var a number
rollingpig@test> exec select log(2,4096) into :a from dual
PL/SQL procedure successfully completed.
rollingpig@test> print :a
A
----------
12
rollingpig@test> exec dbms_output.put_line(:a)
11.99999999999999999999999999999999999994
PL/SQL procedure successfully completed.
rollingpig@test>
回复

使用道具 举报

千问 | 2014-9-10 21:37:07 | 显示全部楼层
不只是显示的问题,我在存储过程里用log(2, p_bin)的结果进行运算,得到的也是有一大串小数的,影响了我的计算结果
回复

使用道具 举报

千问 | 2014-9-10 21:37:07 | 显示全部楼层
最初由 space6212 发布
[B]从存储过程和命令窗口得到的结果为什么不一致呢?
[php]
SQL> create or replace procedure p_test(p_bin number) is
2l_log number;
3begin
4
5select log(2, p_bin) into l_log from dual;
6dbms_output.put_line(l_log);
7end p_test;
8/
Procedure created
SQL> exec p_test(4096)
11.99999999999999999999999999999999999994
PL/SQL procedure successfully completed
SQL> select log(2, 4096)from dual;
LOG(2,4096)
-----------
12
.
[/php]
在9i和10g都试过了,结果都不一致。
为什么呢? [/B]

简单的说,是由于LOG函数处理精度不足造成的,其中SQLPLUS又帮忙做了近似,导致结果令人迷惑。
详细内容可以参考:
http://yangtingkun.itpub.net/post/468/283955
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行