Java程序和MySQL数据库中关于小数的保存问题
文章目錄
- MySQL 中的小數(shù)類型
- decimal
- double
- float
- Java 中的小數(shù)類型
- float
- double
- BigDecimal
- 金額的計(jì)算
MySQL 中的小數(shù)類型
decimal
MySQL 使用 decimal 保存高精度的小數(shù),可以設(shè)置保留的小數(shù)個數(shù)。decimal(m,d),表示該值一共顯示 m 位整數(shù),其中 d 位位于小數(shù)點(diǎn)后面。
decimal 和 numeric 類型在 MySQL 中視為相同的類型。它們用于保存必須為確切精度的值,例如貨幣數(shù)據(jù)。當(dāng)聲明該類型的列時,可以(并且通常要)指定精度和標(biāo)度。
例如:
在該例子中,5 是精度,2 是標(biāo)度。精度表示保存值的主要位數(shù),標(biāo)度表示小數(shù)點(diǎn)后面可以保存的位數(shù)。
在標(biāo)準(zhǔn)SQL中,語法 decimal(m) 等價于 decimal(m,0)。同樣,語法 decimal 等價于 decimal(m,0),可以通過計(jì)算確定 m 的值。在MySQL 5.1中支持 decimal 和 numeric 數(shù)據(jù)類型的變量形式。m 默認(rèn)值是 10。
decimal 或 numeric 的最大位數(shù)是 65,但具體的 decimal 或 numeric 列的實(shí)際范圍受具體列的精度或標(biāo)度約束。如果此類列分配的值小數(shù)點(diǎn)后面的位數(shù)超過指定的標(biāo)度允許的范圍,值被轉(zhuǎn)換為該標(biāo)度。(具體操作與操作系統(tǒng)有關(guān),但一般結(jié)果均被截取到允許的位數(shù))。
注:當(dāng)對 decimal 類型的數(shù)據(jù)進(jìn)行運(yùn)算操作時,如果數(shù)值溢出會報錯。
double
salary double(7,4)在該例子中,7 是精度,4 是標(biāo)度,精度范圍是 24~53。
MySQL 將 double 視為 double precision(非標(biāo)準(zhǔn)擴(kuò)展)的同義詞。MySQL 還將 real 視為 double precision(非標(biāo)準(zhǔn)擴(kuò)展)的同義詞,除非 SQL服務(wù)器模式包括 REAL_AS_float 選項(xiàng)。
為了保證最大可能的可移植性,需要使用近似數(shù)值數(shù)據(jù)值存儲的代碼應(yīng)使用 float 或 double precision,不規(guī)定精度或位數(shù)。
注:double 數(shù)據(jù)在運(yùn)算時,如果數(shù)字溢出不會報錯,會有精度的損失。
float
float 類型用于表示近似數(shù)值數(shù)據(jù)類型。SQL 標(biāo)準(zhǔn)允許在關(guān)鍵字 float 后面的括號內(nèi)選擇用位指定精度(但不能為指數(shù)范圍)。0 到 23 的精度對應(yīng) float 列的 4 字節(jié)單精度。
例如,定義為 float(7,4) 的一個列可以顯示為 -999.9999。MySQL 保存值時進(jìn)行四舍五入,因此如果在 float(7,4) 列內(nèi)插入 999.00009,近似結(jié)果是 999.0001。
注:float 數(shù)據(jù)在運(yùn)算時,如果數(shù)字溢出不會報錯,會有精度的損失。
Java 中的小數(shù)類型
float
單精度浮點(diǎn)型,含字節(jié)數(shù)為 4,32bit,差不多 7 個有效位,整數(shù)部分最多 7 位,小數(shù)部分最多 7 位,取值范圍太小,幾乎沒有用
double
雙精度浮點(diǎn)數(shù),含字節(jié)數(shù)為 8,64bit,差不多 15 個有效位,整數(shù)部分最多 15 位,小數(shù)部分最多 15 位,基本夠用,計(jì)算金錢可以達(dá)到 1 億億以內(nèi)的范圍。
BigDecimal
比較大的小數(shù)只能使用 BigDecimal 來接收,MySQL 數(shù)據(jù)庫 decimal 可以保存最多 65 位的小數(shù),但是 double 只能接收差不多 15 位的小數(shù)。
數(shù)據(jù)庫獲取到數(shù)據(jù)需要轉(zhuǎn)換成字符串類型,然后再使用 BigDecimal(String) 構(gòu)造器將數(shù)值封裝成一個 BigDecimal 對象。
金額的計(jì)算
金額需要轉(zhuǎn)成最小單位,例如,1.24 元,需要轉(zhuǎn)換成 124 分,再進(jìn)行計(jì)算,計(jì)算后再轉(zhuǎn)換成元
總結(jié)
以上是生活随笔為你收集整理的Java程序和MySQL数据库中关于小数的保存问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 让我们敲希望的钟啊是什么歌 让我们敲希望
- 下一篇: IntelliJ IDEA for Ma