關於double/float 兩種基本類型精度丟失的總結


現在是2017年8月26號19:點37分,上周有我最好的朋友來找我,忙着聊天沒有時間寫博客,現在我補寫一篇,算是我十年博客的第五周,好了,言歸正傳,今天我想記錄的是java類中double/float關於精度丟失的問題!

首先,我想讓大家看一段代碼:

1 public static void main(String[] args) {
2         
3     System.out.println("0.05+0.01="+(0.05+0.01));
4     System.out.println("1.0-0.42="+(1.0-0.42));
5     System.out.println("4.015*100="+(4.015*100));
6     System.out.println("123.3/100="+(123.3/100));
7         
8 }

很意外,最后返回的結果是:

為什么java語言返回之后結果不是我們預料的結果呢?事實上,不光java語言,C語言、C++等眾多語言,都存在這種精度丟失的現象,整數永遠可以用二進制精確表示 ,但小數就不一定了。關於精度丟失的具體原理,我就不在這里一一述說了,附上一篇文章,有興趣可以查看:

http://www.cnblogs.com/yewsky/articles/1864934.html

 

那么有沒有方法可以避免精度丟失的情況呢?當然有,我在這里介紹java當中的一種類:BigDecimal,在平常的開發中使用java.math.BigDecimal類來進行精確計算。

在使用BigDecimal類來進行計算的時候,主要分為以下步驟:

       1、用float或者double變量構建BigDecimal對象。

       2、通過調用BigDecimal的加,減,乘,除等相應的方法進行算術運算。

       3、把BigDecimal對象轉換成float,double,int等類型。

 一般來說,可以使用BigDecimal的構造方法或者靜態方法的valueOf()方法把基本類型的變量構建成BigDecimal對象。

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

最后,我用上面的代碼案例說明,做一個結尾

 1 public static void main(String[] args) {
 2     
 3     BigDecimal b1 = new BigDecimal("0.05");
 4     BigDecimal b2 = BigDecimal.valueOf(0.01);
 5         
 6     System.out.println("0.05+0.01="+b1.add(b2));
 7     System.out.println("0.05-0.01="+b1.subtract(b2));
 8     System.out.println("0.05*0.01="+b1.multiply(b2));
 9     System.out.println("0.05/0.01="+b1.divide(b2));
10         
11 }

最后輸出的結果是:

備注:

創建BigDecimal對象時,不要直接使用double浮點數作為構造器參數來調用BigDecimal構造器,否則同樣會發生精度丟失的問題

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM