閱讀632 返回首頁    go 阿裏雲 go 技術社區[雲棲]


java中float,double利用BigDecimal運算

一、發現問題

float、double兩種基本類型在運算的時候容易引起精度丟失。以float為例說明。

public static void main(String[] args) {

   float x = 1.0f;
   float y = 0.8f;
   float z = x - y;
   System.out.println(z);
}
結果是0.19999999

二、解決辦法

利用java.math中的BigDecimal類進行操作

public static void main(String[] args) {

   float x = 1.0f;
   float y = 0.8f;
  
   BigDecimal x1 = new BigDecimal(Float.toString(x));
   BigDecimal x2 = new BigDecimal(Float.toString(y));
   float z = x1.subtract(x2).floatValue(); 
   System.out.println(z);
}
結果是0.2

三、注意點

注意點1

new BigDecimal(...)填寫構造函數的時候,一定要使用String,而不要使用float或者double,否則同樣會引起精度丟失。

注意點2
public static void main(String[] args) {
   float x = 1.0f;
   float y = 0.8f;
   BigDecimal x1 = new BigDecimal(Float.toString(x));
   BigDecimal x2 = new BigDecimal(Float.toString(y));
   x1.subtract(x2);
   System.out.println(x1);
}
x1仍然是1.0,因為不是引用類型。正確的是如下寫法:

public static void main(String[] args) {
   float x = 1.0f;
   float y = 0.8f;
   BigDecimal x1 = new BigDecimal(Float.toString(x));
   BigDecimal x2 = new BigDecimal(Float.toString(y));
   x1 = x1.subtract(x2);
   System.out.println(x1);

}


最後更新:2017-04-03 20:19:07

  上一篇:go javascript中encodeURI和decodeURI方法
  下一篇:go Android MediaStore 與Media.EXTERNAL_CONTENT_URI