欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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


首先我們先來看如下代碼示例:

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

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

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

對于常用的加,減,乘,除,BigDecimal類提供了相應(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對象轉(zhuǎn)換成相應(yīng)的基本數(shù)據(jù)類型的變量,可以使用floatValue(),doubleValue()等方法。
下面是一個工具類,該工具類提供加,減,乘,除運(yùn)算。

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

public class Arith {
/**
 * 提供精確加法計(jì)算的add方法
 * @param value1 被加數(shù)
 * @param value2 加數(shù)
 * @return 兩個參數(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 兩個參數(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 兩個參數(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 兩個參數(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注解知識點(diǎn)

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

    這篇文章主要介紹了詳解Java注解知識點(diǎn),文中有非常詳細(xì)的代碼示例,對正在學(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ì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 到底如何設(shè)置Java線程池的大小的方法示例

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

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

    spring中ioc是什么

    IoC是一種讓服務(wù)消費(fèi)者不直接依賴于服務(wù)提供者的組件設(shè)計(jì)方式,是一種減少類與類之間依賴的設(shè)計(jì)原則。下面通過本文給大家分享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í)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • SpringBoot實(shí)現(xiàn)數(shù)據(jù)預(yù)熱的方式小結(jié)

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

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

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

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

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

    springboot整合redis比較簡單,并且使用redistemplate可以讓我們更加方便的對數(shù)據(jù)進(jìn)行操作。下面通過本文給大家分享springboot整合redis進(jìn)行數(shù)據(jù)操作的相關(guān)知識,感興趣的朋友一起看看吧
    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)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • 淺析Java IO相關(guān)知識點(diǎn)

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

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

最新評論