成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用BigDecimal進(jìn)行精確運(yùn)算

AlphaGooo / 1899人閱讀

摘要:浮點(diǎn)數(shù)沒(méi)有辦法是用二進(jìn)制進(jìn)行精確表示。我們的表示浮點(diǎn)數(shù)由兩個(gè)部分組成指數(shù)和尾數(shù),這樣的表示方法一般都會(huì)失去一定的精確度,有些浮點(diǎn)數(shù)運(yùn)算也會(huì)產(chǎn)生一定的誤差。浮點(diǎn)數(shù)的值實(shí)際上是由一個(gè)特定的數(shù)學(xué)公式計(jì)算得到的。

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

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)進(jìn)行精確計(jì)算。

? 在使用BigDecimal類來(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)說(shuō),可以使用BigDecimal的構(gòu)造方法或者靜態(tài)方法的valueOf()方法把基本類型的變量構(gòu)建成BigDecimal對(duì)象。

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

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

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ù)類型的變量,可以使用floatValue(),doubleValue()等方法。

? 下面是一個(gè)工具類,該工具類提供加,減,乘,除運(yùn)算。

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();    
    }

        /**
         * 舍余
         * @param value1 被除數(shù)
         * @param value2 除數(shù)
         * @param scale 精確范圍
         * @return 兩個(gè)參數(shù)的商
         * @throws IllegalAccessException
         */
        public static BigDecimal div2(double value1, double value2, int scale) throws IllegalAccessException{
                BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
                BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
                return b1.divide(b2, scale, RoundingMode.FLOOR);
        }
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75622.html

相關(guān)文章

  • 高精度數(shù)學(xué)運(yùn)算

    摘要:使用,保證精度的同時(shí),能精準(zhǔn)的進(jìn)行四舍六入計(jì)算。類精確的數(shù)學(xué)運(yùn)算使用來(lái)實(shí)現(xiàn)精準(zhǔn)度因?yàn)榫鹊脑驑?gòu)造方法的結(jié)果有一定的不可預(yù)知性,例如因此建議使用。算法規(guī)則四舍六入五考慮,五后非零就進(jìn)一,五后皆零看奇偶,五前為偶應(yīng)舍去,五前為奇要進(jìn)一。 四舍六入計(jì)算 算法規(guī)則: 四舍六入五考慮, 五后非零就進(jìn)一, 五后皆零看奇偶, 五前為偶應(yīng)舍去, 五前為奇要進(jìn)一。 使用BigDecimal,保證精度的...

    liaosilzu2007 評(píng)論0 收藏0
  • 拯救你丟失的精度——BigInteger和BigDecimal類(入門)

    摘要:返回的是是一個(gè)整數(shù)的最小值。筆記這個(gè)構(gòu)造函數(shù)的結(jié)果可能有些不可預(yù)測(cè)。這是因?yàn)椴荒芟窕蛘咦鳛槿魏斡邢揲L(zhǎng)度的二進(jìn)制分?jǐn)?shù)精確地表示。當(dāng)必須用作源為,注意,此構(gòu)造提供了一個(gè)精確的轉(zhuǎn)換它不會(huì)將轉(zhuǎn)換為使用方法,然后使用構(gòu)造函數(shù)相同的結(jié)果。 第三階段 JAVA常見(jiàn)對(duì)象的學(xué)習(xí) BigInteger和BigDecimal類 BigInteger類 (一) 構(gòu)造方法: //針對(duì)超過(guò)整數(shù)范圍的運(yùn)算(整數(shù)最大...

    TerryCai 評(píng)論0 收藏0
  • BigDecimal 學(xué)習(xí)

    摘要:然而表示這個(gè)是的鍋,我不背。的表示一共的數(shù)字位能存儲(chǔ)個(gè),表示存儲(chǔ)兩位小數(shù)。因?yàn)槟J(rèn)是保留兩位小數(shù),超過(guò)了精度,所以保存近似值。大范圍低精度存儲(chǔ)。很準(zhǔn)確,采用科學(xué)計(jì)數(shù)法,損失精度,但能存儲(chǔ)更大范圍的數(shù)據(jù),但是精度有損失。 BigDecimal 為什么要使用這個(gè)呢?簡(jiǎn)單點(diǎn)說(shuō)就是商業(yè)要求精度計(jì)算,而double計(jì)算出來(lái)的結(jié)果,往往出人意料。 例子 Double運(yùn)算 showImg(https...

    linkFly 評(píng)論0 收藏0
  • java學(xué)習(xí)(五) —— 常用API類概述

    摘要:成員方法類概述用于產(chǎn)生隨機(jī)數(shù)成員方法正則表達(dá)式相關(guān)方法判斷功能分割功能替換功能獲取功能和類的使用類概述包含一些有用的類字段和方法。注意它不能被實(shí)例化,因?yàn)榇祟悩?gòu)造器是私有的成員方法類類概述表示特定的瞬間,精確到毫秒。 前言 我們都知道,JDK包含了JRE,而JRE中也提供了各種功能的java類,現(xiàn)在我們就對(duì)這些類有個(gè)簡(jiǎn)單了解,然后靈活運(yùn)用。 常用類:Object類/Scanner類,...

    Tecode 評(píng)論0 收藏0
  • Java編程基礎(chǔ)15——正則表達(dá)式&常用工具類

    摘要:正則表達(dá)式的概述和簡(jiǎn)單使用正則表達(dá)式是指一個(gè)用來(lái)描述或者匹配一系列符合某個(gè)語(yǔ)法規(guī)則的字符串的單個(gè)字符串。例如,在表達(dá)式中,存在四個(gè)這樣的組組零始終代表整個(gè)表達(dá)式。 1_正則表達(dá)式的概述和簡(jiǎn)單使用 A:正則表達(dá)式 是指一個(gè)用來(lái)描述或者匹配一系列符合某個(gè)語(yǔ)法規(guī)則的字符串的單個(gè)字符串。其實(shí)就是一種規(guī)則。有自己特殊的應(yīng)用。 作用:比如注冊(cè)郵箱,郵箱有用戶名和密碼,一般會(huì)對(duì)其限制長(zhǎng)度,這個(gè)...

    miqt 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<