number类型的精度问题

longgedexin 2008-10-22 08:06:40
是这样的:
在存储过程里有三个变量:n_money number(8,2),n_je number(8,2),i_month int,(i_month 是3位整数)
我想在 n_money = n_je * i_month,调试存储过程,提示:系统错误!ORA-06502: PL/SQL: 数字或值错误 : 数值精度太高

本人水平比较菜,不明白原因。
是number(8,2)的精度乘以一个3位整数后所得结果的精度要比number(8,2)类型的精度大吗?

我现在唯一的解决方法就是在乘积付给n_money之前把乘积降低精度,使乘积能放进n_money里,因为n_money要更新到表里,而相应字段就是number(8,2)类型的,n_je是一个4位或5位整数、两位小数的值,i_month是一个三位的整数。

请高手支招!!
...全文
801 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
longgedexin 2008-10-22
  • 打赏
  • 举报
回复
回复以上所有:

是我疏忽了,4位*3位得出的数可能是7位,n_money可能放不下了,唯一的解决方法就是改后台表!谢谢各位!
mantisXF 2008-10-22
  • 打赏
  • 举报
回复
不行,如果你的N_JE * I_MONTH值是2253678.00, 你难道想要225367?
就算行,你的数据也不对。唯一的办法就是改精度,其他没什么好办法。[Quote=引用 7 楼 longgedexin 的回复:]
引用 5 楼 mantisXF 的回复:
SQL code-- 超过精度当然会报错: 解决办法就是把8位数提高。
-- ENTER_JE = 3 & ENTER_MONTH = 123456.77 3*123456.77 = 370370.31 ~= 370371 共8位数 = 8
SQL> DECLARE
2 N_MONEY NUMBER(8, 2);
3 N_JE NUMBER(8, 2);
4 I_MONTH INT;
5
6 BEGIN
7 N_JE := &ENTER_JE;
8 I_MONTH := &ENTER_MONTH;
9
10 N_MONEY := N_J…
[/Quote]
butchroller 2008-10-22
  • 打赏
  • 举报
回复
number(8,2) 只够存储6位数,楼主对精度的理解有问题。
longgedexin 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mantisXF 的回复:]
SQL code-- 超过精度当然会报错: 解决办法就是把8位数提高。
-- ENTER_JE = 3 & ENTER_MONTH = 123456.77 3*123456.77 = 370370.31 ~= 370371 共8位数 = 8
SQL> DECLARE
2 N_MONEY NUMBER(8, 2);
3 N_JE NUMBER(8, 2);
4 I_MONTH INT;
5
6 BEGIN
7 N_JE := &ENTER_JE;
8 I_MONTH := &ENTER_MONTH;
9
10 N_MONEY := N_JE * I_MONTH;
11
12 DBMS…
[/Quote]

是否可以在赋值给n_money前把乘积的精度降低?
如果要提高n_money的精度的话,那表里的字段的精度也得改,这样会涉及到很多问题,属于下下策
butchroller 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 longgedexin 的回复:]
引用 2 楼 butchroller 的回复:
n_money number(8,2) 存储的上限是 999999.99。
你检查下 n_je * i_month 是否超出了这个范围。


没有超,但oracle就是报错
[/Quote]
“n_je是一个4位或5位整数、两位小数的值,i_month是一个三位的整数”
-------------
4位数乘3位数就已经超了!
mantisXF 2008-10-22
  • 打赏
  • 举报
回复
-- 超过精度当然会报错: 解决办法就是把8位数提高。
-- ENTER_JE = 3 & ENTER_MONTH = 123456.77 3*123456.77 = 370370.31 ~= 370371 共8位数 = 8
SQL> DECLARE
2 N_MONEY NUMBER(8, 2);
3 N_JE NUMBER(8, 2);
4 I_MONTH INT;
5
6 BEGIN
7 N_JE := &ENTER_JE;
8 I_MONTH := &ENTER_MONTH;
9
10 N_MONEY := N_JE * I_MONTH;
11
12 DBMS_OUTPUT.PUT_LINE('N_MONEY:' || N_MONEY);
13 END;
14 /

N_MONEY:370371

PL/SQL procedure successfully completed

-- ENTER_JE = 3 & ENTER_MONTH = 811162.66 3*811162.66 = 2433487.98 共9位数 > 8
SQL> DECLARE
2 N_MONEY NUMBER(8, 2);
3 N_JE NUMBER(8, 2);
4 I_MONTH INT;
5
6 BEGIN
7 N_JE := &ENTER_JE;
8 I_MONTH := &ENTER_MONTH;
9
10 N_MONEY := N_JE * I_MONTH;
11
12 DBMS_OUTPUT.PUT_LINE('N_MONEY:' || N_MONEY);
13 END;
14 /

DECLARE
N_MONEY NUMBER(8, 2);
N_JE NUMBER(8, 2);
I_MONTH INT;

BEGIN
N_JE := 3;
I_MONTH := 811162.11;

N_MONEY := N_JE * I_MONTH;

DBMS_OUTPUT.PUT_LINE('N_MONEY:' || N_MONEY);
END;

ORA-06502: PL/SQL: numeric or value error: number precision too large
ORA-06512: at line 10
[Quote=引用楼主 longgedexin 的帖子:]
是这样的:
在存储过程里有三个变量:n_money number(8,2),n_je number(8,2),i_month int,(i_month 是3位整数)
我想在 n_money = n_je * i_month,调试存储过程,提示:系统错误!ORA-06502: PL/SQL: 数字或值错误 : 数值精度太高

本人水平比较菜,不明白原因。
是number(8,2)的精度乘以一个3位整数后所得结果的精度要比number(8,2)类型的精度大吗?

我现在唯一的解决方法就是在乘积付给n_money之前把乘积降低…
[/Quote]
longgedexin 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 butchroller 的回复:]
n_money number(8,2) 存储的上限是 999999.99。
你检查下 n_je * i_month 是否超出了这个范围。
[/Quote]

没有超,但oracle就是报错
longgedexin 2008-10-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 BlueskyWide 的回复:]
把n_money number(8,2)改为:
n_money FLOAT(15)后,再试一下。
[/Quote]
我已经说了,n_money的精度不可改,因为要向字段里插,这个字段就是number(8,2)的
butchroller 2008-10-22
  • 打赏
  • 举报
回复
n_money number(8,2) 存储的上限是 999999.99。
你检查下 n_je * i_month 是否超出了这个范围。
BlueskyWide 2008-10-22
  • 打赏
  • 举报
回复
把n_money number(8,2)改为:
n_money FLOAT(15)后,再试一下。

17,089

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧