Java中BigDecimal類的簡單用法
本文實例講述了Java中BigDecimal類的簡單用法,是Java程序設(shè)計中非常實用的技巧,分享給大家供大家參考。具體用法分析如下:
一般來說,一提到Java里面的商業(yè)計算,我們都知道不能用float和double,因為他們無法進行精確計算。但是Java的設(shè)計者給編程人員提供了一個很有用的類BigDecimal,他可以完善float和double類無法進行精確計算的缺憾。BigDecimal類位于java.maths類包下。首先我們來看下如何構(gòu)造一個BigDecimal對象。它的構(gòu)造函數(shù)很多,這里挑選最常用的兩個來演示一下:一個就是BigDecimal(double val),另一個就是BigDecimal(String str)。這兩個看上去沒什么太大區(qū)別,但是正像API描述中說的那樣:
/*The results of this constructor can be somewhat unpredictable. One might assume that
new BigDecimal(.1) is exactly equal to .1, but it is actually equal
to .1000000000000000055511151231257827021181583404541015625. This is so because .1
cannot be represented exactly as a double (or, for that matter, as a binary fraction
of any finite length). Thus, the long value that is being passed in to the constructor
is not exactly equal to .1, appearances nonwithstanding.
The (String) constructor, on the other hand, is perfectly predictable: new BigDecimal
(".1") is exactly equal to .1, as one would expect. Therefore, it is generally
recommended that the (String) constructor be used in preference to this one.*/
也就是說利用double作為參數(shù)的構(gòu)造函數(shù),無法精確構(gòu)造一個BigDecimal對象,需要自己指定一個上下文的環(huán)境,也就是指定精確位。而利用String對象作為參數(shù)傳入的構(gòu)造函數(shù)能精確的構(gòu)造出一個BigDecimal對象。請看下面的代碼:
import java.math.*;
public class TestBigDecimal {
public static void main(String args[]){
BigDecimal bd = new BigDecimal("10.123");
BigDecimal bd1 = new BigDecimal(10.123);
System.out.println(bd +"/n"+ bd1);
}
}
運行后輸出:
10.123
10.1229999999999993320898283855058252811431884765625
所以我們在選擇構(gòu)造函數(shù)時,要看具體需求而定。
另外,很多人會問到怎么將基本類型,如int,float,double,long,和BigDecimal對象相互轉(zhuǎn)換。很簡單:
基本類型通過構(gòu)造函數(shù)轉(zhuǎn)換成對應(yīng)的BigDecimal對象,而BigDecimal類提供了諸如intValue(), floatValue(), doubleValue(), longValue()方法來將BigDecimal對象轉(zhuǎn)換成對應(yīng)的值。
關(guān)于BigDecimal是如何計算的,我以論壇中一個人的提問帖子為例,來簡單的寫出BigDecimal的運算方法。題目是:李白無事街上走,提壺去買酒。遇店加一倍,見花喝一斗,五遇花和店,喝光壺中酒,試問李白壺中原有多少斗酒?
這道題應(yīng)該是從后往前推,并且要逆運算,最后得出原有酒的體積。
import java.math.*;
public class Libai {
public static void main(String args[]){
BigDecimal volumn = new BigDecimal("0");
for (int i=0; i<5; i++){
volumn = volumn.add(new BigDecimal("1"));
volumn = volumn.divide(new BigDecimal("2"));
}
System.out.print(volumn);
}
}
運行結(jié)果:
0.96875
希望本文所述對大家Java程序設(shè)計的學(xué)習(xí)有所幫助。
相關(guān)文章
SpringBoot整合Dubbo框架,實現(xiàn)RPC服務(wù)遠程調(diào)用
Dubbo是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調(diào)用,智能容錯和負載均衡,以及服務(wù)自動注冊和發(fā)現(xiàn)。今天就來看下SpringBoot整合Dubbo框架的步驟2021-06-06
springboot+dynamicDataSource動態(tài)添加切換數(shù)據(jù)源方式
這篇文章主要介紹了springboot+dynamicDataSource動態(tài)添加切換數(shù)據(jù)源方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
Java如何使用poi導(dǎo)入導(dǎo)出excel工具類
這篇文章主要介紹了Java如何使用poi導(dǎo)入導(dǎo)出excel工具類問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
Java使用百度AI接口實現(xiàn)智能機器人對話系統(tǒng)
AI已經(jīng)在各行各業(yè)中廣泛應(yīng)用,助力于各式各樣的業(yè)務(wù),而在機器人對話中,我們可以通過利用百度AI中的自然語言處理、問答知識圖譜等技術(shù),使機器人可以更加智能化、自然化的為用戶服務(wù),本文介紹Java利用百度AI接口實現(xiàn)智能機器人對話系統(tǒng)2024-01-01
zookeeper+Springboot實現(xiàn)服務(wù)器動態(tài)上下線監(jiān)聽教程詳解
這篇文章主要介紹了zookeeper+Springboot實現(xiàn)服務(wù)器動態(tài)上下線監(jiān)聽,主要介紹了什么是服務(wù)器動態(tài)上下線監(jiān)聽及為什么要實現(xiàn)對服務(wù)器上下線的監(jiān)聽,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-06-06
Spring注解@Configuration與@Bean注冊組件的使用詳解
這篇文章主要介紹了SpringBoot中的注解@Configuration與@Bean注冊組件的使用,具有很好的參考價值,希望對大家有所幫助2022-06-06

