2010-07-16 60 views
11

我正在處理我的應用程序中的許多不同貨幣,我想知道將它們存儲在SQLite3數據庫中的「最佳」方式是什麼。在SQLite3中存儲貨幣值

我傾向於定點表示(即將它們存儲爲整數,其中3.59美元存儲爲359,400美元存儲爲40000)。這是一個好主意嗎?如果我的輸入數據後來發生變化並且需要更高精度會怎麼樣

回答

18

鑑於SQLite 3將最多使用8個字節來存儲INTEGER類型,除非您打算使用大於10^16的數字,您應該沒問題。

從這個角度來看,世界國內生產總值以千分之一美元(一家工廠)表示,大約61'000'000'000'000'000 sqlite3沒有問題表達。

sqlite> create table gdp (planet string, mills integer); 
sqlite> insert into gdp (planet, mills) values ('earth', 61000000000000000000); 
sqlite> select * from gdp; 
earth|61000000000000000000 

除非你正在處理星際會計,我認爲你不必擔心。

+1

必須考慮所有可能性...... ;-)謝謝! – nornagon 2010-07-16 03:35:04

+10

那麼,爲了完全準確,這並不能解釋所有可能性:http://en.wikipedia.org/wiki/File%3AZimbabwe_%24100_trillion_2009_Obverse.jpg – msw 2010-07-16 04:07:36

0

我會說字符串/文本。如果你需要這樣做,你總是可以將其轉換爲任何文化。

+3

將數字數據存儲爲字符串是愚蠢的,特別是當存在支持用例的完美精細的數字類型。 – 2013-05-03 10:06:36

1

在財務軟件貨幣總是表示爲定點(十進制)。 您可以使用整數在SQLite中模擬它(64位整數可容納18位數字)。

0

最好的貨幣數據類型是BigDecimal和SQLite中,您可以在存儲爲VARCHAR

ormlite的BigDecimal轉換爲字符串時,你存儲。

ormlite doc for BigDecimal

-3

的SQLite沒有BigDecimal的領域 所以我使用SQLite整數類型和轉換,像這樣: BigDecimal的BD =新的BigDecimal( 「1234.5678」); int packedInt = bd.scaleByPowerOfTen(4).intValue(); // packedInt now = 12345678 現在將packedInt保存到SQLite Integer字段。 要返回BigDecimal: BigDecimal bd = new BigDecimal(packedInt); // bd = 12345678 bd = bd.scaleByPowerOfTen(-4); // now bd = 1234.5678

+0

請不要發佈[相同的答案](http://stackoverflow.com/a/39626427/5292302)多個問題。發佈一個很好的答案,然後投票/標記以重複關閉其他問題。如果問題不重複,*定製您的問題答案。* – 2016-09-21 21:05:08

相關問題