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 16:48:33