先看下面的例子:
public class Test
{
public static void main(String[] args)
{
double sum=0;
double temp=0.38;
for(int i=0;i<10;i++)
{
sum=sum+temp;
System.out.println("sum:"+sum);
System.out.println(sum);
}
}
}
程序运行后打印出下面的结果:
sum:0.38
0.38
sum:0.76
0.76
sum:1.1400000000000001
1.1400000000000001
sum:1.52
1.52
sum:1.9
1.9
sum:2.28
2.28
sum:2.6599999999999997
2.6599999999999997
sum:3.0399999999999996
3.0399999999999996
sum:3.4199999999999995
3.4199999999999995
sum:3.7999999999999994
3.7999999999999994
这并不是我们需要的结果,为啥会这样呢?
Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。现在终于理解为什么要有BCD码了。
这个问题相当严重,如果你有9.999999999999元,你的计算机是不会认为你可以购买10元的商品的。
在有的编程语言中提供了专门的货币类型来处理这种情况,但是Java没有。现在让我们看看如何解决这个问题。
public class Test
{
public static void main(String[] args)
{
double sum=0;
double temp=0.38;
for(int i=0;i<10;i++)
{
BigDecimal b1=new BigDecimal(Double.toString(sum));
BigDecimal b2=new BigDecimal(Double.toString(temp));
sum=b1.add(b2).doubleValue(); }
System.out.println("sum"+sum);
}
}
sum:0.38
sum:0.76
sum:1.14
sum:1.52
sum:1.9
sum:2.28
sum:2.66
sum:3.04
sum:3.42
sum:3.8