亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用BigDecimal進(jìn)行精確運(yùn)算(實(shí)現(xiàn)加減乘除運(yùn)算)

 更新時(shí)間:2013年11月20日 16:36:50   作者:  
這篇文章主要介紹了如何使用BigDecimal進(jìn)行精確運(yùn)算,最后提供了一個(gè)工具類(lèi),該工具類(lèi)提供加,減,乘,除運(yùn)算


首先我們先來(lái)看如下代碼示例:

復(fù)制代碼 代碼如下:

public class Test_1 {
public static void main(String[] args) {
System.out.println(0.06+0.01);
System.out.println(1.0-0.42);
System.out.println(4.015*100);
System.out.println(303.1/1000);
}
}

運(yùn)行結(jié)果如下
0.06999999999999999
 0.5800000000000001
 401.49999999999994
 0.30310000000000004

你認(rèn)為你看錯(cuò)了,但結(jié)果卻是是這樣的。問(wèn)題在哪里呢?原因在于我們的計(jì)算機(jī)是二進(jìn)制的。浮點(diǎn)數(shù)沒(méi)有辦法是用二進(jìn)制進(jìn)行精確表示。我們的CPU表示浮點(diǎn)數(shù)由兩個(gè)部分組成:指數(shù)和尾數(shù),這樣的表示方法一般都會(huì)失去一定的精確度,有些浮點(diǎn)數(shù)運(yùn)算也會(huì)產(chǎn)生一定的誤差。如:2.4的二進(jìn)制表示并非就是精確的2.4。反而最為接近的二進(jìn)制表示是 2.3999999999999999。浮點(diǎn)數(shù)的值實(shí)際上是由一個(gè)特定的數(shù)學(xué)公式計(jì)算得到的。
其實(shí)java的float只能用來(lái)進(jìn)行科學(xué)計(jì)算或工程計(jì)算,在大多數(shù)的商業(yè)計(jì)算中,一般采用java.math.BigDecimal類(lèi)來(lái)進(jìn)行精確計(jì)算。
在使用BigDecimal類(lèi)來(lái)進(jìn)行計(jì)算的時(shí)候,主要分為以下步驟:
1、用float或者double變量構(gòu)建BigDecimal對(duì)象。
2、通過(guò)調(diào)用BigDecimal的加,減,乘,除等相應(yīng)的方法進(jìn)行算術(shù)運(yùn)算。
3、把BigDecimal對(duì)象轉(zhuǎn)換成float,double,int等類(lèi)型。
一般來(lái)說(shuō),可以使用BigDecimal的構(gòu)造方法或者靜態(tài)方法的valueOf()方法把基本類(lèi)型的變量構(gòu)建成BigDecimal對(duì)象。

復(fù)制代碼 代碼如下:

BigDecimal b1 = new BigDecimal(Double.toString(0.48));
BigDecimal b2 = BigDecimal.valueOf(0.48);

對(duì)于常用的加,減,乘,除,BigDecimal類(lèi)提供了相應(yīng)的成員方法。

復(fù)制代碼 代碼如下:

public BigDecimal add(BigDecimal value);//加法
public BigDecimal subtract(BigDecimal value); //減法
public BigDecimal multiply(BigDecimal value); //乘法
public BigDecimal divide(BigDecimal value); //除法

進(jìn)行相應(yīng)的計(jì)算后,我們可能需要將BigDecimal對(duì)象轉(zhuǎn)換成相應(yīng)的基本數(shù)據(jù)類(lèi)型的變量,可以使用floatValue(),doubleValue()等方法。
下面是一個(gè)工具類(lèi),該工具類(lèi)提供加,減,乘,除運(yùn)算。

復(fù)制代碼 代碼如下:

public class Arith {
/**
 * 提供精確加法計(jì)算的add方法
 * @param value1 被加數(shù)
 * @param value2 加數(shù)
 * @return 兩個(gè)參數(shù)的和
 */
public static double add(double value1,double value2){
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.add(b2).doubleValue();
}

/**
 * 提供精確減法運(yùn)算的sub方法
 * @param value1 被減數(shù)
 * @param value2 減數(shù)
 * @return 兩個(gè)參數(shù)的差
 */
public static double sub(double value1,double value2){
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.subtract(b2).doubleValue();
}

/**
 * 提供精確乘法運(yùn)算的mul方法
 * @param value1 被乘數(shù)
 * @param value2 乘數(shù)
 * @return 兩個(gè)參數(shù)的積
 */
public static double mul(double value1,double value2){
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.multiply(b2).doubleValue();
}

/**
 * 提供精確的除法運(yùn)算方法div
 * @param value1 被除數(shù)
 * @param value2 除數(shù)
 * @param scale 精確范圍
 * @return 兩個(gè)參數(shù)的商
 * @throws IllegalAccessException
 */
public static double div(double value1,double value2,int scale) throws IllegalAccessException{
//如果精確范圍小于0,拋出異常信息
if(scale<0){
  throw new IllegalAccessException("精確度不能小于0");
}
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.divide(b2, scale).doubleValue();
}
}

相關(guān)文章

  • 詳解Java注解知識(shí)點(diǎn)

    詳解Java注解知識(shí)點(diǎn)

    這篇文章主要介紹了詳解Java注解知識(shí)點(diǎn),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • Java使用LinkedHashMap進(jìn)行分?jǐn)?shù)排序

    Java使用LinkedHashMap進(jìn)行分?jǐn)?shù)排序

    這篇文章主要介紹了Java使用LinkedHashMap進(jìn)行分?jǐn)?shù)排序的相關(guān)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 到底如何設(shè)置Java線程池的大小的方法示例

    到底如何設(shè)置Java線程池的大小的方法示例

    在我們?nèi)粘I(yè)務(wù)開(kāi)發(fā)過(guò)程中,或多或少都會(huì)用到并發(fā)的功能。那么并發(fā)線程池到底設(shè)置多大呢?文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • spring中ioc是什么

    spring中ioc是什么

    IoC是一種讓服務(wù)消費(fèi)者不直接依賴(lài)于服務(wù)提供者的組件設(shè)計(jì)方式,是一種減少類(lèi)與類(lèi)之間依賴(lài)的設(shè)計(jì)原則。下面通過(guò)本文給大家分享spring中ioc的概念,感興趣的朋友一起看看吧
    2017-09-09
  • Java List Object[]轉(zhuǎn)換成List T的實(shí)例

    Java List Object[]轉(zhuǎn)換成List T的實(shí)例

    這篇文章主要介紹了Java List Object[]轉(zhuǎn)換成List T的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • SpringBoot實(shí)現(xiàn)數(shù)據(jù)預(yù)熱的方式小結(jié)

    SpringBoot實(shí)現(xiàn)數(shù)據(jù)預(yù)熱的方式小結(jié)

    這里用到的數(shù)據(jù)預(yù)熱,就是在項(xiàng)目啟動(dòng)時(shí)將一些數(shù)據(jù)量較大的數(shù)據(jù)加載到緩存中(筆者這里用的Redis),那么在項(xiàng)目啟動(dòng)有哪些方式可以實(shí)現(xiàn)數(shù)據(jù)預(yù)熱呢,本文就來(lái)給大家講講幾種實(shí)現(xiàn)數(shù)據(jù)預(yù)熱的方式,需要的朋友可以參考下
    2023-09-09
  • java 學(xué)習(xí)筆記(入門(mén)篇)_java的基礎(chǔ)語(yǔ)法

    java 學(xué)習(xí)筆記(入門(mén)篇)_java的基礎(chǔ)語(yǔ)法

    從基礎(chǔ)語(yǔ)法開(kāi)始,這個(gè)語(yǔ)法你也可以理解為英語(yǔ)或是漢語(yǔ)里面的語(yǔ)法,只不過(guò)大家各有各的特點(diǎn)和區(qū)別;那么在學(xué)習(xí)的過(guò)程中我們就要不斷的積累重要的類(lèi)和方法,這樣寫(xiě)程序就會(huì)方便快捷了,下面就開(kāi)始學(xué)習(xí)java的基礎(chǔ)語(yǔ)法
    2013-01-01
  • springboot整合redis進(jìn)行數(shù)據(jù)操作(推薦)

    springboot整合redis進(jìn)行數(shù)據(jù)操作(推薦)

    springboot整合redis比較簡(jiǎn)單,并且使用redistemplate可以讓我們更加方便的對(duì)數(shù)據(jù)進(jìn)行操作。下面通過(guò)本文給大家分享springboot整合redis進(jìn)行數(shù)據(jù)操作的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2017-10-10
  • Java利用happen-before規(guī)則如何實(shí)現(xiàn)共享變量的同步操作詳解

    Java利用happen-before規(guī)則如何實(shí)現(xiàn)共享變量的同步操作詳解

    這篇文章主要給大家介紹了關(guān)于Java利用happen-before規(guī)則實(shí)現(xiàn)共享變量的同步操作的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • 淺析Java IO相關(guān)知識(shí)點(diǎn)

    淺析Java IO相關(guān)知識(shí)點(diǎn)

    本篇文章給大家分享了關(guān)于java io的一些相關(guān)知識(shí)點(diǎn)以及相關(guān)內(nèi)容,對(duì)此有需要的朋友可以學(xué)習(xí)參考下。
    2018-05-05

最新評(píng)論