Java中简单的浮点数类型float和double是不能进行运算的,不光Java,很多语言都是这样。
我们运行下面程序你将会看到
public class TestMathDecimal { public static void main(String [] args){ System.out.println(0.05+0.01); System.out.println(1.0 - 0.42); System.out.println(4.015 * 100); System.out.println(123.3 / 100); } }
没错,结果确实是:
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
我们的第一反应是做四舍五入。Math中的roound是不能够设置保留几位小数的。
Math.round(4.015 * 100)的结果为401,而不是我们期望的402。
因此如果我们要进行精确的四舍五入,不能利用简单类型做任何运算。
java.text.DecimalFormat也不能解决这个问题:
System.out.println(new java.text.DecimalFormat("0.00").format(4.015));输出的是4.02。
BigDecimal
在商业计算中我们要用java.math.BigDecimal.BigDecimal有四个构造方法,我们不关心BigInteger来构造的那两个,还有两个分别是:
BigDecimal(double val)
BigDecimal(String val)
除法运算:
System.out.println(new BigDecimal(153.5).divide(new BigDecimal(100), 2, BigDecimal.ROUND_HALF_UP));
new BigDecimal(100)除数,2精确的位数,BigDecimal.ROUND_HALF_UP:舍入模式
加法运算:
System.out.println(new BigDecimal("2.005").add(new BigDecimal("0.03")));
减法运算:
System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.10")));
乘法运算:
System.out.println(new BigDecimal("2.05").multiply(new BigDecimal("10")));
ps:此处可能说的不是很清楚,以后会继续更新的。