中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java?double類型相加問題舉例分析

發布時間:2021-12-13 11:08:07 來源:億速云 閱讀:332 作者:iii 欄目:開發技術

本篇內容介紹了“Java double類型相加問題舉例分析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

Java double類型相加問題

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

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

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

一、這個時候就要采用BigDecimal函數進行運算

第一步、建立String類型的數據

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

以下兩種不推薦:

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

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

另外該文章提供了一個計算輔助類Java Double相加出現的怪事
急需的話,直接學習、創建該工具類,就可以完成項目了。以下是 加法算法的幾個實現的方法。

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 關鍵字。

可應用于類、接口或方法。

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

嚴格約束意味著所有表達式的結果都必須是 IEEE 754 算法對操作數預期的結果,以單精度和雙精度格式表示。

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三個類型的數據時候
結果:
普通 188122.47999999998
strictfp 188122.47999999998
BigDEcimel: 188122.48

輸入
3.21, 4.24,5.03
結果
普通 12.48
strictfp 12.48
BigDEcimel: 12.48

輸入:
12353.21,21334.24
結果:
普通 33687.45
strictfp 33687.45
BigDEcimel: 33687.45

結論是:

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

附錄:.

//使用double類型創建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 類的構造方法

Double 類中的構造方法有如下兩個。

  • Double(double value):構造一個新分配的 Double 對象,它表示轉換為 double 類型的參數。

  • Double(String s):構造一個新分配的 Double 對象,它表示 String 參數所指示的 double 值。

分別使用以上兩個構造方法獲取 Double 對象:

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

Double 類的常用方法

Java?double類型相加問題舉例分析

如何將字符串 56.7809 轉換為 double 類型的數值,或者將 double 類型的數值 56.7809 轉換為對應的字符串呢?

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

在將字符串轉換為 double 類型的數值的過程中,如果字符串中包含非數值類型的字符,則程序執行將出現異常。

Double 類的常用常量

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

  • MAX_VALUE:值為 1.8E308 的常量,它表示 double 類型的最大正有限值的常量。

  • MIN_VALUE:值為 4.9E-324 的常量,它表示 double 類型數據能夠保持的最小正非零值的常量。

  • NaN:保存 double 類型的非數字值的常量。

  • NEGATIVE_INFINITY:保持 double 類型的負無窮大的常量。

  • POSITIVE_INFINITY:保持 double 類型的正無窮大的常量。

  • SIZE:用秦以二進制補碼形式表示 double 值的比特位數。

  • TYPE:表示基本類型 double 的 Class 實例。

“Java double類型相加問題舉例分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

郴州市| 广饶县| 闽清县| 大宁县| 通河县| 中西区| 苍梧县| 兰西县| 马龙县| 团风县| 墨脱县| 德昌县| 太保市| 丹东市| 高唐县| 巧家县| 曲靖市| 福贡县| 阆中市| 贺兰县| 台江县| 长阳| 北辰区| 郓城县| 乐至县| 瑞丽市| 曲松县| 和田市| 陵水| 南通市| 牙克石市| 鄢陵县| 晋城| 巴青县| 绥棱县| 浙江省| 中卫市| 偃师市| 科技| 将乐县| 乌恰县|