Java中BigDecimal類(lèi)的簡(jiǎn)單用法
本文實(shí)例講述了Java中BigDecimal類(lèi)的簡(jiǎn)單用法,是Java程序設(shè)計(jì)中非常實(shí)用的技巧,分享給大家供大家參考。具體用法分析如下:
一般來(lái)說(shuō),一提到Java里面的商業(yè)計(jì)算,我們都知道不能用float和double,因?yàn)樗麄儫o(wú)法進(jìn)行精確計(jì)算。但是Java的設(shè)計(jì)者給編程人員提供了一個(gè)很有用的類(lèi)BigDecimal,他可以完善float和double類(lèi)無(wú)法進(jìn)行精確計(jì)算的缺憾。BigDecimal類(lèi)位于java.maths類(lèi)包下。首先我們來(lái)看下如何構(gòu)造一個(gè)BigDecimal對(duì)象。它的構(gòu)造函數(shù)很多,這里挑選最常用的兩個(gè)來(lái)演示一下:一個(gè)就是BigDecimal(double val),另一個(gè)就是BigDecimal(String str)。這兩個(gè)看上去沒(méi)什么太大區(qū)別,但是正像API描述中說(shuō)的那樣:
/*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.*/
也就是說(shuō)利用double作為參數(shù)的構(gòu)造函數(shù),無(wú)法精確構(gòu)造一個(gè)BigDecimal對(duì)象,需要自己指定一個(gè)上下文的環(huán)境,也就是指定精確位。而利用String對(duì)象作為參數(shù)傳入的構(gòu)造函數(shù)能精確的構(gòu)造出一個(gè)BigDecimal對(duì)象。請(qǐng)看下面的代碼:
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); } }
運(yùn)行后輸出:
10.123
10.1229999999999993320898283855058252811431884765625
所以我們?cè)谶x擇構(gòu)造函數(shù)時(shí),要看具體需求而定。
另外,很多人會(huì)問(wèn)到怎么將基本類(lèi)型,如int,float,double,long,和BigDecimal對(duì)象相互轉(zhuǎn)換。很簡(jiǎn)單:
基本類(lèi)型通過(guò)構(gòu)造函數(shù)轉(zhuǎn)換成對(duì)應(yīng)的BigDecimal對(duì)象,而B(niǎo)igDecimal類(lèi)提供了諸如intValue(), floatValue(), doubleValue(), longValue()方法來(lái)將BigDecimal對(duì)象轉(zhuǎn)換成對(duì)應(yīng)的值。
關(guān)于BigDecimal是如何計(jì)算的,我以論壇中一個(gè)人的提問(wèn)帖子為例,來(lái)簡(jiǎn)單的寫(xiě)出BigDecimal的運(yùn)算方法。題目是:李白無(wú)事街上走,提壺去買(mǎi)酒。遇店加一倍,見(jiàn)花喝一斗,五遇花和店,喝光壺中酒,試問(wèn)李白壺中原有多少斗酒?
這道題應(yīng)該是從后往前推,并且要逆運(yùn)算,最后得出原有酒的體積。
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); } }
運(yùn)行結(jié)果:
0.96875
希望本文所述對(duì)大家Java程序設(shè)計(jì)的學(xué)習(xí)有所幫助。
相關(guān)文章
RabbitMQ消費(fèi)端ACK NACK及重回隊(duì)列機(jī)制詳解
這篇文章主要為大家介紹了RabbitMQ消費(fèi)端ACK NACK及重回隊(duì)列機(jī)制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12@PathVariable為空時(shí)指定默認(rèn)值的操作
這篇文章主要介紹了@PathVariable為空時(shí)指定默認(rèn)值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02sftp和ftp 根據(jù)配置遠(yuǎn)程服務(wù)器地址下載文件到當(dāng)前服務(wù)
這篇文章主要介紹了sftp和ftp 根據(jù)配置遠(yuǎn)程服務(wù)器地址下載文件到當(dāng)前服務(wù)的相關(guān)資料本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10SpringBoot構(gòu)建Restful service完成Get和Post請(qǐng)求
這篇文章主要介紹了SpringBoot構(gòu)建Restful service完成Get和Post請(qǐng)求的示例代碼,感興趣的朋友一起看看吧2017-08-08Java 實(shí)戰(zhàn)項(xiàng)目之在線點(diǎn)餐系統(tǒng)的實(shí)現(xiàn)流程
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)一個(gè)在線點(diǎn)餐系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11Java開(kāi)發(fā)崗位面試被問(wèn)到嵌套類(lèi)怎么辦
本篇文章主要介紹了深入理解Java嵌套類(lèi)和內(nèi)部類(lèi),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-07-07