2014-03-28 40 views
1

我是一個PLSQL語句來反轉一個數字。PLSQL中除法運算符的混淆行爲

和代碼是這樣的

declare 
num5 int:=54321; 
revnum int:=0; 
temp int; 
num int; 
begin 
num:=num5; 
while(num5>0) 
loop 
    temp:=mod(num5,10); 
    num5:=num5/10; 
    revnum:=revnum*10+temp; 
end loop; 
dbms_output.put_line('Original number is '||num); 
dbms_output.put_line('Reverse number is '||revnum); 
end; 
/

,我得到的輸出是 :

原號碼是54321

反向號碼是123451

我的代碼似乎好的, 爲什麼我會得到額外的'1'

爲了進一步挖掘,我試圖將一個小於10的數字分開,然後我得到1而不是'0';

這裏發生了什麼事?

我試過的示例代碼。

declare 
num int:=6; 
res int; 
begin 
res:=num/10; 
dbms_output.put_line(res); 
end; 
/

這裏的輸出是1而不是0.爲什麼?

回答

2

您正在使用整數。 6/10四捨五入爲1個

declare 
num1 number; 
num2 int; 
begin 
num1 := 6/10; 
num2 := 6/10; 
dbms_output.put_line(num1); 
dbms_output.put_line(num2); 

end; 
/

結果

.6 
1 

您需要周圍的num5/10 TRUNC。否則,循環得到另一個循環。 (5/10)= .5被四捨五入爲1.

declare 
num5 int:=715143212; 
revnum int:=0; 
begin 
dbms_output.put_line('Original number is '||num5); 
while num5 > 0 
loop 
    revnum := revnum * 10; 
    revnum := revnum + mod(num5,10); 
    num5 := trunc(num5/10); 
end loop; 
dbms_output.put_line('Reverse number is '||revnum); 
end; 
/
+0

我從來沒有意識到四捨五入的概念。謝謝羅伯特。 – user3473132

+0

6/10被隱式轉換爲整數(舍入)。 –

0

我理解你的問題,如果我說你想扭轉一個數字(或字符串)? 因此2468變成8642.我認爲還有另外一種方法來實現這一點。

declare 

    num5 int:=54321; 
    revnum int:=0; 
    temp int; 
    num int; 

    lv_num5  varchar2(100); 
    ln_num5  number(3); 
    lv_rev_num5 varchar2(100) := null; 
    ln_rev_num5 number(3); 

begin 

    lv_num5 := to_char(num5); 
    ln_num5 := length(lv_num5); 

    for x in reverse 1..ln_num5 -- From the last digit to the first digit 

    lv_rev_num5 := lv_rev_num5||substr(lv_num5, x, 1); 

    end loop; 

    ln_rev_num5 := to_number(lv_rev_num5); 

    dbms_output.put_line('1- Original number is '||num5); 
    -- Or 
    dbms_output.put_line('2- Original number is '||lv_num5); 
    dbms_output.put_line('Reverse number is '||ln_rev_num5); 

end; 
/

我希望這個解決方案也適合你。

問候 卡洛斯