2017-02-13 80 views
1

當我將數值存儲在表中並在SQL Developer中查詢該表時,它不會顯示Number數據類型的尾隨零。Oracle是否爲Number數據類型存儲尾隨零?

create table decimal_test(decimal_field number(*,10)); 

insert into decimal_test(decimal_field) values(10); 
insert into decimal_test(decimal_field) values(10.11); 
insert into decimal_test(decimal_field) values(10.100); 
insert into decimal_test(decimal_field) values(10.00); 

select * from decimal_test; 

,結果是

10 
10.11 
10.1 
10 

這些值從Java代碼處理。在這種情況下,我正在使用BigDecimal來存儲該值。

在保存到DB之前,如果我有BigDecimal(10.00),保存之後,從DB返回的值爲BigDecimal(10)。等於BigDecimal中的方法失敗,因爲比例已更改。

而我的小數精度不是恆定的。用戶可以設置BigDecimal(10.00)或BigDecimal (10.000)等。因此,值需要按照原樣存儲在DB中。

有什麼辦法在oracle中存儲尾隨零?

+0

我使用SQL Developer工具來查詢數據進行測試。但是我們使用java oracle jdbc在實際場景中查詢結果。 – suren

+0

我不認爲您可以告訴Oracle存儲尾隨零,但您應該能夠配置您的SQL客戶端(或您的應用程序)以便將輸出格式化爲期望的小數位數。 –

+0

小數位數不是常數。用戶可以設置任意數量的小數位數。但是有一個最大限制。 – suren

回答

5

尾隨零的存在是顯示問題,而不是存儲問題。尾隨零不重要,並且無論如何,只要正確,數字的內部格式就不重要。 1010.00000之間沒有數值差異。

如果您需要尾隨零,您可以在轉換顯示值時始終使用格式。例如:

System.out.printf("%10.4d\n", decimalValue); 

如果問題是在規模上的差異,你可以設置規模,以適當的值進行比較之前。

4

如果你想保留數字輸入的規模(這可以顯著 - 從量度10.100的10.1措施是不同的)的規模存儲在一個額外的列。

create table decimal_test 
(decimal_field number(*,10), 
decimal_scale number(*,0) 
); 

計算輸入的比例並將其存儲在新列decimal_scale中。

在輸出格式中使用此值。

我最好不建議號碼存儲爲一個字符串 - 你保持規模,但寬鬆的數量驗證和潛在地錯誤估計造成的類型轉換混淆CBO ...

2

10 10.00是一般是相同的數字。 (如果您必須支付10美元或10.00美元甚至10.0000美元,則不會產生影響:-)

但是,如果您要表示測量值的精度,那麼10.00表示您只知道最多兩位小數的數字,但實際的數字可以是10.00001或10.009或其他,然後您必須添加這些信息。一種方法是使用字符串數據類型,但是你必須堅持某種格式('10。00「或者說'10,00'),並且不應該在數據庫中使用它進行計算。

另一種選擇是存儲數字和附加的小數位數的精度,例如,值= 10/decimal_places = 2。我寧願這通過存儲一個字符串。