PostgreSQL 貨幣類型

2021-08-26 16:29 更新

money類型存儲(chǔ)固定小數(shù)精度的貨幣數(shù)字,參閱表 8.3。小數(shù)的精度由數(shù)據(jù)庫的lc_monetary設(shè)置決定。表中展示的范圍假設(shè)有兩個(gè)小數(shù)位??山邮艿妮斎敫袷胶芏?,包括整數(shù)和浮點(diǎn)數(shù)文字,以及常用的貨幣格式,如'$1,000.00'。 輸出通常是最后一種形式,但和區(qū)域相關(guān)。

表 8.3. 貨幣類型

名字存儲(chǔ)尺寸描述范圍
money8 bytes貨幣額-92233720368547758.08到+92233720368547758.07

由于這種數(shù)據(jù)類型的輸出是區(qū)域敏感的,因此將money數(shù)據(jù)裝入到一個(gè)具有不同lc_monetary設(shè)置的數(shù)據(jù)庫是不起作用的。為了避免這種問題,在恢復(fù)一個(gè)轉(zhuǎn)儲(chǔ)到一個(gè)新數(shù)據(jù)庫中之前,應(yīng)確保新數(shù)據(jù)庫的lc_monetary設(shè)置和被轉(zhuǎn)儲(chǔ)數(shù)據(jù)庫的相同或者具有等效值。

數(shù)據(jù)類型numericintbigint的值可以被造型成money。從數(shù)據(jù)類型realdouble precision的轉(zhuǎn)換可以通過先造型成numeric來實(shí)現(xiàn),例如:

SELECT '12.34'::float8::numeric::money;

但是,我們不推薦這樣做。浮點(diǎn)數(shù)不應(yīng)該被用來處理貨幣,因?yàn)楦↑c(diǎn)數(shù)可能會(huì)有圓整錯(cuò)誤。

一個(gè)money值可以在不損失精度的情況下被造型成numeric。轉(zhuǎn)換到其他類型可能會(huì)丟失精度,并且必須采用兩個(gè)階段完成:

SELECT '52093.89'::money::numeric::float8;

一個(gè)money值被一個(gè)整數(shù)值除的除法結(jié)果會(huì)被截去分?jǐn)?shù)部分。要得到圓整的結(jié)果,可以除以一個(gè)浮點(diǎn)值,或者在除法之前把money轉(zhuǎn)換成numeric然后在除法之后轉(zhuǎn)回money(如果要避免精度丟失的風(fēng)險(xiǎn)則后者更好)。當(dāng)一個(gè)money值被另一個(gè)money值除時(shí),結(jié)果是double precision(即一個(gè)純數(shù)字,而不是金額),在除法中貨幣單位被約掉了。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)