91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

利用JAVA如何實現浮點數計算

發布時間:2020-11-09 17:50:45 來源:億速云 閱讀:308 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關利用JAVA如何實現浮點數計算,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

問題:

對兩個double類型的值進行運算,有時會出現結果值異常的問題。比如:

  System.out.println(19.99+20);
  System.out.println(1.0-0.66);
  System.out.println(0.033*100);
  System.out.println(12.3/100);

輸出:

39.989999999999995
0.33999999999999997
3.3000000000000003
0.12300000000000001

Java中的簡單浮點數類型float和double不能夠精確運算。這個問題其實不是JAVA的bug,因為計算機本身是二進制的,而浮點數實際上只是個近似值,所以從二進制轉化為十進制浮點數時,精度容易丟失,導致精度下降。

關于精度損失的原理可以很簡單的講,首先一個正整數在計算機中表示使用01010形式表示的,浮點數也不例外。

比如11,11除以2等于5余1

       5除以2等于2余1

       2除以2等于1余0

       1除以2等于0余1

所以11二進制表示為:1011.

double類型占8個字節,64位,第1位為符號位,后面11位是指數部分,剩余部分是有效數字。

正整數除以2肯定會有個盡頭的,之后二進制還原成十進制只需要乘以2即可。

舉個例子:0.99用的有效數字部分,

       0.99 * 2 = 1+0.98 --> 1
       0.98 * 2 = 1+0.96 --> 1
       0.96 * 2 = 1+0.92 -- >1
       0.92 * 2 = 1+0.84 -- >1
         ...............

這樣周而復始是沒法有盡頭的,而double有效數字有限,所以必定會有損失,所以二進制無法準確表示0.99,就像十進制無法準確表示1/3一樣。

解決辦法:

在《Effective Java》中提到一個原則,那就是float和double只能用來作科學計算或者是工程計算,但在商業計算中我們要用java.math.BigDecimal,通過使用BigDecimal類可以解決上述問題,首先需要注意的是,直接使用字符串來構造BigDecimal是絕對沒有精度損失的,如果用double或者把double轉化成string來構造BigDecimal依然會有精度損失,所以我覺得這種解決方法就是在使用中就把浮點數用string來表示存放,涉及到運算直接用string構造double,否則肯定會有精度損失。

1. 相加

/**
 * 相加
 * @param double1
 * @param double2
 * @return
 */
public static double add(String doubleValA, String doubleValB) { 
  BigDecimal a2 = new BigDecimal(doubleValA); 
  BigDecimal b2 = new BigDecimal(doubleValB); 
  return a2.add(b2).doubleValue(); 
}

2. 相減

/**
 * 相減
 * @param double1
 * @param double2
 * @return
 */
public static double sub(String doubleValA, String doubleValB) { 
  BigDecimal a2 = new BigDecimal(doubleValA); 
  BigDecimal b2 = new BigDecimal(doubleValB); 
  return a2.subtract(b2).doubleValue();
}

3. 相乘

/**
 * 相乘
 * @param double1
 * @param double2
 * @return
 */
public static double mul(String doubleValA, String doubleValB) { 
  BigDecimal a2 = new BigDecimal(doubleValA); 
  BigDecimal b2 = new BigDecimal(doubleValB); 
  return a2.multiply(b2).doubleValue();
}

4. 相除

/**
 * 相除
 * @param double1
 * @param double2
 * @param scale 除不盡時指定精度
 * @return
 */
public static double div(String doubleValA, String doubleValB, int scale) { 
  BigDecimal a2 = new BigDecimal(doubleValA); 
  BigDecimal b2 = new BigDecimal(doubleValB);
  return a2.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); 
}

5. 主函數調用

public static void main(String[] args) {
  String doubleValA = "3.14159267";
  String doubleValB = "2.358";
  System.out.println("add:" + add(doubleValA, doubleValB));
  System.out.println("sub:" + sub(doubleValA, doubleValB));
  System.out.println("mul:" + mul(doubleValA, doubleValB));
  System.out.println("div:" + div(doubleValA, doubleValB, 8));
}

結果展示如下所示:

 add:5.49959267
 sub:0.78359267
 mul:7.40787551586
 div:1.33231241

所以最好的方法是完全拋棄double,用string和java.math.BigDecimal。

java遵照IEEE制定的浮點數表示法來進行float,double運算。這種結構是一種科學計數法,用符號、指數和尾數來表示,底數定為2——即把一個浮點數表示為尾數乘以2的指數次方再添上符號。具體底層如何存儲以及如何進行運行請繼續關注我的博客,后續我會將詳情總結好的。

上述就是小編為大家分享的利用JAVA如何實現浮點數計算了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

安西县| 抚宁县| 郁南县| 固安县| 阿勒泰市| 全南县| 宜良县| 文山县| 漳浦县| 嘉善县| 文化| 文登市| 房山区| 桐梓县| 栖霞市| 塔城市| 普陀区| 长沙市| 儋州市| 本溪| 英超| 永济市| 云南省| 黄陵县| 九龙城区| 浑源县| 阜新| 柘荣县| 越西县| 六枝特区| 开平市| 白沙| 大丰市| 上思县| 鄂托克旗| 明水县| 鲁山县| 桃园县| 富蕴县| 汨罗市| 南宁市|