BigDecimal和Double
float和Double主要是在广泛的数值范围中提供较为精确的的快速近似计算而设计。
需要小数值和性能精确可以使用int和long进行进位计算。
超18位使用BigDecimal,并会提供多种舍入方法。
以上在需要精度时使用。
测试
import java.math.BigDecimal;
public class TestBigDecimal {
public static void main(String[] args) {
/**
* 0.30000000000000004
* 0.1
* 0.020000000000000004
* 2.0
* -------------
* 0.3000000000000000166533453693773481063544750213623046875
* 0.1000000000000000055511151231257827021181583404541015625
* 0.0200000000000000022204460492503131424770215565731879227912941627176741932192527428924222476780414581298828125
* 2
* -------------
* 0.3
* 0.1
* 0.02
* 2
*/
Double a = 0.2;
Double b = 0.1;
System.out.println(a+b);//0.30000000000000004
System.out.println(a-b);
System.out.println(a*b);//0.020000000000000004
System.out.println(a/b);
System.out.println("-------------");
BigDecimal ba = new BigDecimal(0.2);
BigDecimal bb = new BigDecimal(0.1);
System.out.println(ba.add(bb));//0.3000000000000000166533453693773481063544750213623046875
System.out.println(ba.subtract(bb));//0.1000000000000000055511151231257827021181583404541015625
System.out.println(ba.multiply(bb));//0.0200000000000000022204460492503131424770215565731879227912941627176741932192527428924222476780414581298828125
System.out.println(ba.divide(bb));
System.out.println("-------------");
BigDecimal ba2 = new BigDecimal(Double.toString(0.2));
BigDecimal bb2 = new BigDecimal(Double.toString(0.1));
System.out.println(ba2.add(bb2));//0.3
System.out.println(ba2.subtract(bb2));//0.1
System.out.println(ba2.multiply(bb2));//0.02
System.out.println(ba2.divide(bb2));//2
}
}