解決BigDecimal轉(zhuǎn)long丟失精度的問題
我就廢話不多說了,大家還是直接看代碼吧~
public static void main(String[] args) { BigDecimal asdBigDecimal = new BigDecimal(56.33347); long sad = asdBigDecimal.longValue(); double asda = asdBigDecimal.doubleValue(); System.out.println(sad); System.out.println(asda); }
運(yùn)行結(jié)果:
56
56.33347
而且BigDecimal.longValue()還會(huì)自動(dòng)四舍五入,不想舍去小數(shù)點(diǎn)的朋友要用doubleValue()
補(bǔ)充知識(shí):BigDecimal與int、long之間的相互轉(zhuǎn)換及基本數(shù)據(jù)類型知識(shí)掌握
(Java提供了兩個(gè)用于高精度計(jì)算的類:BigInteger和BigDecimal。這兩個(gè)類包含的方法、提供的操作與對(duì)基本類型所能執(zhí)行的操作相似,只不過是以方法調(diào)用方式取代運(yùn)算符方式來實(shí)現(xiàn)。等于是用速度換取了精度。 BigInteger支持任意精度的整數(shù),在運(yùn)算中可以準(zhǔn)確地表示任何大小的整數(shù)值,而不會(huì)丟失任何信息。BigDecimal支持任何精度的定點(diǎn)數(shù),可以用它進(jìn)行精確的貨幣計(jì)算。
它們都擴(kuò)展Number類且實(shí)現(xiàn)Comparable接口,可以使用new BigInteger(String)或new BigDecimal(String)來創(chuàng)建實(shí)例,使用add,substract,multiple,divide和remainder方法完成算數(shù)運(yùn)算,使用compareTo方法比較兩個(gè)大數(shù)字。
一般來說,BigInteger用的不是很多,BigDecimal用的稍微多一點(diǎn),就比如說JDBC中,如果一個(gè)字段的數(shù)據(jù)庫類型是Number, 那么getObject().getClass()的結(jié)果是java.math.BigDecimal?! ?/p>
BigInteger相比Integer的確可以用big來形容。它是用于科學(xué)計(jì)算,Integer只能容納一個(gè)int, 所以最大值也就是2的31次訪減去1,十進(jìn)制為2147483647,如果需要計(jì)算更大的數(shù),那么31位顯然是不夠用了,BigInteger能夠容納的位數(shù)那可就大了,我簡(jiǎn)單試了一下,上千位沒有任何問題。除了容量大之外,BigInteger還封裝了一些常見的操作,比如+-*/的基本操作,還有絕對(duì)值,相反數(shù),最大公約數(shù),是否是質(zhì)數(shù)等等的運(yùn)算?! ?/p>
BigDecimal的實(shí)現(xiàn)利用到了BigInteger, 所不同的是BigDecimal加入了小數(shù)位的概念,比如BigDecimal d = new BigDecimal(new BigInteger(ib),5);5表示的是5個(gè)小數(shù)位。BigDecimal可以用來做超大的浮點(diǎn)數(shù)的運(yùn)算,比如+-*/的運(yùn)算,其中除法運(yùn)算是最復(fù)雜的,因?yàn)樯痰奈粩?shù)還有除不斷的情況下末位小數(shù)點(diǎn)的處理都是需要考慮的。)
我們?cè)趯?shí)際開發(fā)過程中,BigDecimal是經(jīng)常用到的一個(gè)數(shù)據(jù)類型,它和int、long之間可以項(xiàng)目轉(zhuǎn)換。
int 轉(zhuǎn)換成 BigDecimal 數(shù)據(jù)類型
//int 轉(zhuǎn)換成 bigDecimal類型 public static void intToBigDecimal(){ int b = 5; BigDecimal a = new BigDecimal(b); System.out.println(a +"的數(shù)據(jù)類型是"+a.getClass().getName()); }
Long轉(zhuǎn)換成 BigDecimal 數(shù)據(jù)類型
//Long 類型轉(zhuǎn)換成 bigDecimal public static void longToBigDecimal(){ long b = 5; BigDecimal a = new BigDecimal(b); System.out.println(a +"的數(shù)據(jù)類型是"+a.getClass().getName()); }
BigDecimal 轉(zhuǎn)換成 Long數(shù)據(jù)類型
//bigDecimal 轉(zhuǎn)換成 Long類型 public static void bigDecimalToLong(){ BigDecimal b = new BigDecimal(12); Long c = b.longValue(); System.out.println(c+"的數(shù)據(jù)類型是"+c.getClass().getName()); }
BigDecimal 轉(zhuǎn)換成 int數(shù)據(jù)類型
//bigDecimal 轉(zhuǎn)換成 int類型 public static void bigDecimalToInt(){ BigDecimal b = new BigDecimal(12); int c = b.intValue(); }
附:基本數(shù)據(jù)類型及所占位數(shù)及初始值
基本數(shù)據(jù)類型 | 所占位數(shù) | 初始值 |
byte | 字節(jié)型 1字節(jié)(8bit) | 0 |
short | 短整型 2字節(jié)(16bit) | 0 |
int | 整型 4字節(jié)(32bit) | 0 |
long | 長(zhǎng)整型 8字節(jié)(64bit) | 0L |
float | 單精度浮點(diǎn)型 4字節(jié)(32bit) | 0.0f |
double | 雙精度浮點(diǎn)型 8字節(jié)(64bit) | 0.0d |
boolean | java未明確指出的大?。赡?bit、1byte、4byte) | false |
char | 字符型 2字節(jié)(16bit) | 空格 |
附:java的數(shù)據(jù)類型
附:轉(zhuǎn)換中的知識(shí)點(diǎn)
java中整數(shù)類型默認(rèn)的int類型;小數(shù)類型默認(rèn)的double;
*char 可以當(dāng)做一中特殊的整數(shù)類型; *int無法轉(zhuǎn)換為boolean; *小數(shù)類型轉(zhuǎn)為整數(shù)類型,小數(shù)可能被舍棄,所有出現(xiàn)精度損失,所以需要強(qiáng)制轉(zhuǎn)換; *boolean 類型不能轉(zhuǎn)換成任何其它數(shù)據(jù)類型; byte b2 = 120; //沒報(bào)錯(cuò)的原因: //編譯時(shí)候,進(jìn)行檢查,看賦值大小是否超過變量的類型所容納的范圍 //如果超過,報(bào)錯(cuò):從int轉(zhuǎn)換到byte可能會(huì)有損失,如果沒超過,編譯通過 float f3 = 100L; 這種情況,整數(shù)部分,可以直接賦值給float整數(shù)部分 float f1 = 100.9; 這種情況,因?yàn)槟J(rèn)的是double,如果這樣轉(zhuǎn)換,有可能失去小數(shù)點(diǎn),必須強(qiáng)制轉(zhuǎn)換 long l3 = 1000.9f; 小數(shù)轉(zhuǎn)為整數(shù),小數(shù)可能丟失,需要強(qiáng)制轉(zhuǎn)換 double d2 = 10.9d; int i2 = d2; //錯(cuò)誤: 不兼容的類型: 從double轉(zhuǎn)換到int可能會(huì)有損失 char c1 = 'a'; int i3 = c1; //自動(dòng)轉(zhuǎn)換 int i4 = 100; //char c2 = i4;// 錯(cuò)誤: 不兼容的類型: 從int轉(zhuǎn)換到char可能會(huì)有損失
附:四則運(yùn)算
/* 1、如果兩個(gè)操作數(shù)中有一個(gè)是double類型,另一個(gè)就會(huì)轉(zhuǎn)換為double類型; 2、否則,如果有一個(gè)操作數(shù)是float,另一個(gè)就會(huì)轉(zhuǎn)化為float; 3、否則,如果有一個(gè)操作數(shù)是long,另一個(gè)就會(huì)轉(zhuǎn)換為long; 4、否則,兩個(gè)操作數(shù)都將轉(zhuǎn)換為int類型。 */
附:面試陷阱
byte b1 = 10; byte b2 = 11; //錯(cuò)誤: 不兼容的類型: 從int轉(zhuǎn)換到byte可能會(huì)有損失 //否則,兩個(gè)操作數(shù)都將轉(zhuǎn)換為int類型。 byte b3 = b1 + b2 //錯(cuò)誤 byte b3 = (byte)(b1 + b2); //正確
short s1 = 1; s1 = s1 + 1; //錯(cuò)誤: 不兼容的類型: 從int轉(zhuǎn)換到short可能會(huì)有損失 short s2 = 1; s2 += 1; // 等同于short s2 = (short)(s2 + (short)1); //正確
附:從小到大順序
附:隱式轉(zhuǎn)換、顯式轉(zhuǎn)換
當(dāng)將占位數(shù)少的類型賦值給占位數(shù)多的類型時(shí),java自動(dòng)使用隱式類型轉(zhuǎn)換(如int型轉(zhuǎn)為long型)
當(dāng)把在級(jí)別高的變量的值賦給級(jí)別低變量時(shí),必須使用顯式類型轉(zhuǎn)換運(yùn)算(如double型轉(zhuǎn)為float型)
附:什么是不可變對(duì)象
不可變對(duì)象指對(duì)象一旦被創(chuàng)建,狀態(tài)就不能再改變。任何修改都會(huì)創(chuàng)建一個(gè)新的對(duì)象,如String、Integer及其它包裝類。
以上這篇解決BigDecimal轉(zhuǎn)long丟失精度的問題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
JAVA基礎(chǔ)之控制臺(tái)輸入輸出的實(shí)例代碼
下面小編就為大家?guī)硪黄狫AVA基礎(chǔ)之控制臺(tái)輸入輸出的實(shí)例代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-07-07SpringBoot攔截器實(shí)現(xiàn)項(xiàng)目防止接口重復(fù)提交
基于SpringBoot框架來開發(fā)業(yè)務(wù)后臺(tái)項(xiàng)目時(shí),接口重復(fù)提交是一個(gè)常見的問題,本文主要介紹了SpringBoot攔截器實(shí)現(xiàn)項(xiàng)目防止接口重復(fù)提交,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09Java使用定時(shí)器編寫一個(gè)簡(jiǎn)單的搶紅包小游戲
這篇文章主要為大家介紹了Java如何使用定時(shí)器編寫一個(gè)簡(jiǎn)單的搶紅包小游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下2022-07-07深入解析Java中的編碼轉(zhuǎn)換以及編碼和解碼操作
這篇文章主要介紹了Java中的編碼轉(zhuǎn)換以及編碼和解碼操作,文中詳細(xì)解讀了編碼解碼的相關(guān)IO操作以及內(nèi)存使用方面的知識(shí),需要的朋友可以參考下2016-02-02Spring?Data?JPA實(shí)現(xiàn)審計(jì)功能過程詳解
Spring?Data?JPA為跟蹤持久性層的變化提供了很好的支持。通過使用審核,我們可以存儲(chǔ)或記錄有關(guān)實(shí)體更改的信息,例如誰創(chuàng)建或更改了實(shí)體以及何時(shí)進(jìn)行更改2023-02-02使用Criteria進(jìn)行分組求和、排序、模糊查詢的實(shí)例
這篇文章主要介紹了使用Criteria進(jìn)行分組求和、排序、模糊查詢的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03