本帖最后由 康乐 于 2013-2-17 17:02 编辑
由于在-0.1时结果不够精确,所以出现了死循环。调试时会发现item在减了0.1几次以后结果就会不够精确。
java中floa或者double运算时可能会丢失精度,因为十进制小数转换成二进制数时表示可能不够精确,就像十进制系统中能不能准确表示出1/3,同样二进制系统也无法准确表示1/10。float和double只能用来做科学计算或者是工程计算,在精确的计算中我们要用java.math.BigDecimal。通常用的构造方法是以下两个:
BigDecimal(double val)
BigDecimal(String val)
第一个构造方法虽然用起来方便但是有一定的不可预知性,具体在API中有介绍
所以如果需要精确计算,最好用String来够造BigDecimal。
需要先将两个浮点数转为String,然后够造成BigDecimal,在其中一个上调用方法,传入另一个作为参数,
然后把运算的结果(BigDecimal)再转换为浮点数。
主函数总这样写- double item = 1;
- double sum=0;
- while(item != 0)
- {
- sum += item;
- BigDecimal bdItem = new BigDecimal(Double.toString(item));
- BigDecimal bd = new BigDecimal("0.1");
- item = bdItem.subtract(bd).doubleValue();
- }
- System.out.println("sum="+sum);
复制代码 |