问题实例:
/**
* 避免使用浮点数进行比较(特别是涉及到货币的业务),因为存在误差
*/
public class Test {
public static void main(String[] args) {
float e = 0.1f;
double f = 1.0/10;
System.out.println(e);//0.1
System.out.println(f);//0.1
System.out.println(e==f);//false
System.out.println("===========分割线==========");
float t1 = 393993983883f;
float t2 = t1 + 1;
System.out.println(t1==t2);//true
}
}
解决方法:用BigDecimal类来精确计算货币值。
import java.math.BigDecimal;
public class TestRandom {
public static void main(String[] args) {
BigDecimal bigDecimal_a = new BigDecimal("1.0");
BigDecimal bigDecimal_b = new BigDecimal("10");
BigDecimal bigDecimal_c = new BigDecimal("0.1");
BigDecimal divide = bigDecimal_a.divide(bigDecimal_b);//除法运算,divide:0.1
System.out.println(divide.equals(bigDecimal_c));//true
System.out.println("===========分割线==========");
BigDecimal bigDecimal_d = new BigDecimal("393993983883");
BigDecimal bigDecimal_e = new BigDecimal("1");
BigDecimal bigDecimal_f = bigDecimal_d.add(bigDecimal_e);//加法运算
System.out.println(bigDecimal_d.equals(bigDecimal_f));//false
}
}
注意:除法运算除不尽时必须设置保留小数的格式,不然报错,如下:
import java.math.BigDecimal;
public class TestRandom {
public static void main(String[] args) {
BigDecimal bigDecimal_a = new BigDecimal("10");
BigDecimal bigDecimal_b = new BigDecimal("3");
/**
* 三个参数分别代表除数、商的小数点后的位数、近似处理模式。
* BigDecimal.ROUND_HALF_UP:对商进行四舍五入操作。
*/
BigDecimal divide = bigDecimal_a.divide(bigDecimal_b, 2, BigDecimal.ROUND_HALF_UP);
System.out.println(divide);
}
}
测试结果: