現在是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構造器,否則同樣會發生精度丟失的問題