最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java學(xué)習(xí)筆記:關(guān)于Java?double類型相加問題

 更新時間:2021年12月13日 08:59:50   作者:菜鳥的日志  
這篇文章主要介紹了關(guān)于Java?double類型相加問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Java double類型相加問題

多個double類型的數(shù)直接相加的時候,可能存在精度誤差.( 由于計算機(jī)算法以及硬件環(huán)境決定只能識別 0 1。計算機(jī)默認(rèn)的計算結(jié)果在都在一個指定精度范圍之內(nèi),想往深的了解,可以學(xué)習(xí)數(shù)值分析等)

在金融方面是絕對不允許的,好在java開發(fā)者有這個先見之明。

java.math.*里面提供了BigDecimal類(提供高精度計算的方法)

一、這個時候就要采用BigDecimal函數(shù)進(jìn)行運(yùn)算

第一步、建立String類型的數(shù)據(jù)

第二步、創(chuàng)建BigDecimal對象BigDecimal(Double.toString(double))

以下兩種不推薦:

BigDecimal(double)或者BigDecimal(Double.valueOf(double)))

建議: 涉及到精度問題的時候,整個計算過程都是用String類型或者BigDecimal類對象。最后結(jié)果根據(jù)需求 在轉(zhuǎn)過來。

另外該文章提供了一個計算輔助類Java Double相加出現(xiàn)的怪事

急需的話,直接學(xué)習(xí)、創(chuàng)建該工具類,就可以完成項(xiàng)目了。以下是 加法算法的幾個實(shí)現(xiàn)的方法。

new BigDecimal(Double.toString(double)).add(new BigDecimal(Double.toString(double));
    /**
     * @param b1
     *            BigDecimal
     * @param v2
     *            double
     * @return BigDecimal
     * */
    public BigDecimal add(BigDecimal b1, double v2) {
        // BigDecimal b1=new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2);
    }

    /**
     * @param b1
     *           double
     * @param v2
     *            double
     * @return BigDecimal
     * */
    public BigDecimal add(double v1, double v2) {
         BigDecimal b1=new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2);
    }
    /**
     * @param b1
     *           double
     * @param v2
     *            double
     * @return double
     * */
    public double add(double v1, double v2) {
         BigDecimal b1=new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).doubleValue();
    }

二、double 三種加法比較

+,strictfp,BigDecimel

Strictfp —— Java 關(guān)鍵字。

可應(yīng)用于類、接口或方法。

使用 strictfp 關(guān)鍵字聲明一個方法時,該方法中所有的float和double表達(dá)式都嚴(yán)格遵守FP-strict的限制,符合IEEE-754規(guī)范。

嚴(yán)格約束意味著所有表達(dá)式的結(jié)果都必須是 IEEE 754 算法對操作數(shù)預(yù)期的結(jié)果,以單精度和雙精度格式表示。

public class MathDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.err.println("普通 "+ addNormal(12353.21,21334.24,154435.03));
        System.err.println("strictfp "+addDouble(12353.21,21334.24,154435.03));
        System.err.println("BigDEcimel: "+add(12353.21,21334.24,154435.03));

    }

    public static double addNormal(double... v1) {
        double res = 0;
        for (int i = 0; i < v1.length; i++) {
            res += v1[i];
        }
        return res;
    }

    public static strictfp double addDouble(double... v) {
        double res = 0;
        for (int i = 0; i < v.length; i++) {
            res += v[i];
        }
        return res;
    }

    /**
     * @param b1
     *            double
     * @param v2
     *            double
     * @return double
     */
    public static double add(double... v) {
        BigDecimal b  = new BigDecimal(Double.toString(v[0]));
        for (int i = 1; i < v.length; i++) {
            BigDecimal b2 = new BigDecimal(Double.toString(v[i]));
            b=b.add(b2);
        }
        return b.doubleValue();
    }
}

輸入
12353.21,21334.24,154435.03三個類型的數(shù)據(jù)時候
結(jié)果:
普通 188122.47999999998
strictfp 188122.47999999998
BigDEcimel: 188122.48

輸入
3.21, 4.24,5.03
結(jié)果
普通 12.48
strictfp 12.48
BigDEcimel: 12.48

輸入:
12353.21,21334.24
結(jié)果:
普通 33687.45
strictfp 33687.45
BigDEcimel: 33687.45

結(jié)論是:

BigDecimal的算法精度比較好。 其余兩種方法 都存在缺點(diǎn)。至于strictfp 這個關(guān)鍵字 是去平臺化影響。比如32為機(jī)器和64位機(jī)器結(jié)果都一樣。 對于精度計算結(jié)果影響不大。

附錄:.

//使用double類型創(chuàng)建BigDecimal
  public BigDecimal(double val) {
        if (Double.isInfinite(val) || Double.isNaN(val))
            throw new NumberFormatException("Infinite or NaN");

        // Translate the double into sign, exponent and significand, according
        // to the formulae in JLS, Section 20.10.22.
        long valBits = Double.doubleToLongBits(val);
        int sign = ((valBits >> 63)==0 ? 1 : -1);
        int exponent = (int) ((valBits >> 52) & 0x7ffL);
        long significand = (exponent==0 ? (valBits & ((1L<<52) - 1)) << 1
                            : (valBits & ((1L<<52) - 1)) | (1L<<52));
        exponent -= 1075;
        // At this point, val == sign * significand * 2**exponent.

        /*
         * Special case zero to supress nonterminating normalization
         * and bogus scale calculation.
         */
        if (significand == 0) {
            intVal = BigInteger.ZERO;
            intCompact = 0;
            precision = 1;
            return;
        }

        // Normalize
        while((significand & 1) == 0) {    //  i.e., significand is even
            significand >>= 1;
            exponent++;
        }

        // Calculate intVal and scale
        long s = sign * significand;
        BigInteger b;
        if (exponent < 0) {
            b = BigInteger.valueOf(5).pow(-exponent).multiply(s);
            scale = -exponent;
        } else if (exponent > 0) {
            b = BigInteger.valueOf(2).pow(exponent).multiply(s);
        } else {
            b = BigInteger.valueOf(s);
        }
        intCompact = compactValFor(b);
        intVal = (intCompact != INFLATED) ? null : b;
    }

Java double類詳解

Double 類的構(gòu)造方法

Double 類中的構(gòu)造方法有如下兩個。

  • Double(double value):構(gòu)造一個新分配的 Double 對象,它表示轉(zhuǎn)換為 double 類型的參數(shù)。
  • Double(String s):構(gòu)造一個新分配的 Double 對象,它表示 String 參數(shù)所指示的 double 值。

分別使用以上兩個構(gòu)造方法獲取 Double 對象:

Double double1 = new Double(5.556);    // 以 double 類型的變量作為參數(shù)創(chuàng)建 Double 對象
Double double2 = new Double("5.486");       // 以 String 類型的變量作為參數(shù)創(chuàng)建 Double 對象

Double 類的常用方法

在這里插入圖片描述

如何將字符串 56.7809 轉(zhuǎn)換為 double 類型的數(shù)值,或者將 double 類型的數(shù)值 56.7809 轉(zhuǎn)換為對應(yīng)的字符串呢?

String str = "56.7809";
double num = Double.parseDouble(str);    // 將字符串轉(zhuǎn)換為 double 類型的數(shù)值
double d = 56.7809;
String s = Double.toString(d);    // 將double類型的數(shù)值轉(zhuǎn)換為字符串

在將字符串轉(zhuǎn)換為 double 類型的數(shù)值的過程中,如果字符串中包含非數(shù)值類型的字符,則程序執(zhí)行將出現(xiàn)異常。

Double 類的常用常量

在 Double 類中包含了很多常量,其中較為常用的常量如下。

  • MAX_VALUE:值為 1.8E308 的常量,它表示 double 類型的最大正有限值的常量。
  • MIN_VALUE:值為 4.9E-324 的常量,它表示 double 類型數(shù)據(jù)能夠保持的最小正非零值的常量。
  • NaN:保存 double 類型的非數(shù)字值的常量。
  • NEGATIVE_INFINITY:保持 double 類型的負(fù)無窮大的常量。
  • POSITIVE_INFINITY:保持 double 類型的正無窮大的常量。
  • SIZE:用秦以二進(jìn)制補(bǔ)碼形式表示 double 值的比特位數(shù)。
  • TYPE:表示基本類型 double 的 Class 實(shí)例。

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • zuulGateway 通過filter統(tǒng)一修改返回值的操作

    zuulGateway 通過filter統(tǒng)一修改返回值的操作

    這篇文章主要介紹了zuulGateway 通過filter統(tǒng)一修改返回值的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • HDFS中JAVA API的使用

    HDFS中JAVA API的使用

    HDFS是一個分布式文件系統(tǒng),既然是文件系統(tǒng),就可以對其文件進(jìn)行操作,比如說新建文件、刪除文件、讀取文件內(nèi)容等操作。下面記錄一下使用JAVA API對HDFS中的文件進(jìn)行操作的過程
    2017-07-07
  • Java?中的異常處理機(jī)制詳情介紹

    Java?中的異常處理機(jī)制詳情介紹

    本篇文章主要介紹Java中的異常、如何處理函數(shù)拋出的異常、處理異常的原則、異常處理時,性能開銷大的地方,感興趣的小伙伴可以參考一下
    2022-09-09
  • springboot過濾器和攔截器的實(shí)例代碼

    springboot過濾器和攔截器的實(shí)例代碼

    這篇文章主要介紹了springboot過濾器和攔截器的實(shí)例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • SpringBoot整合Minio的示例代碼

    SpringBoot整合Minio的示例代碼

    這篇文章主要介紹了SpringBoot整合Minio的示例代碼,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • 一文帶你全面了解Java?Properties類

    一文帶你全面了解Java?Properties類

    Properties是JDK1.0中引入的java類,目前也在項(xiàng)目中大量使用,主要用來讀取外部的配置,那除了這個,你對它其他的一些api也了解嗎??你了解它是怎么實(shí)現(xiàn)的嗎??如果不清楚的話,就通過本篇文章帶你一探究竟
    2022-09-09
  • Spring AOP使用接口方式實(shí)現(xiàn)

    Spring AOP使用接口方式實(shí)現(xiàn)

    本文主要介紹了Spring AOP使用接口方式實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java運(yùn)行環(huán)境搭建的圖文教程

    Java運(yùn)行環(huán)境搭建的圖文教程

    下面小編就為大家?guī)硪黄狫ava運(yùn)行環(huán)境搭建的圖文教程。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Java tomcat環(huán)境變量及idea配置解析

    Java tomcat環(huán)境變量及idea配置解析

    這篇文章主要介紹了Java tomcat環(huán)境變量及idea配置解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-12-12
  • java?Executors常用線程池

    java?Executors常用線程池

    這篇文章主要為大家介紹了java?Executors中提供的幾種常用的線程池使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08

最新評論

应用必备| 晋中市| 旺苍县| 常州市| 宜昌市| 周口市| 调兵山市| 双江| 恩平市| 湘潭市| 长武县| 惠水县| 洛浦县| 明溪县| 咸宁市| 都安| 南汇区| 马尔康县| 静安区| 图们市| 慈溪市| 如皋市| 大连市| 土默特左旗| 荣成市| 松滋市| 靖江市| 星子县| 泰兴市| 舒兰市| 时尚| 砚山县| 山东| 丹寨县| 会昌县| 黄梅县| 宜丰县| 武川县| 揭东县| 西城区| 宜章县|