当前位置: 代码迷 >> J2SE >> 一路while习题,求帮助
  详细解决方案

一路while习题,求帮助

热度:86   发布时间:2016-04-23 20:08:02.0
一道while习题,求帮助
class while2{
public static void main(String[] args){
//总共的钱,每天存的钱,每五天用点钱
double sum=0,save=2.6,withdraw=6;
int day=0;
while(true){
day++;
sum+=save;
if(sum>=100){
break;
}
if(day%5==0){
sum-=withdraw;
}
System.out.println(sum+"---"+day);
}

System.out.println("total spend"+day+"day");
System.out.print(sum);
}
}



当save设为2.6的时候,为什么第三天的输出为:7.800000000000001---3,下面有大部分结果也类似这个,save设为2.5却正常.
------解决思路----------------------
double是一个不准确的类型  用BigDecimal类类似代码有

public class While1{
    public static void main(String[] args){
        double a=3.0;
        double b=2.9;
        System.out.println(a-b);
    }
    
}

输出结果0.10000000000000009
------解决思路----------------------
/*第一种方法*/
import java.math.BigDecimal;
class while2{
    public static void main(String[] args){
        //总共的钱,每天存的钱,每五天用点钱
        。。。。。
        while(true){
            。。。。
            if(day%5==0){
            sum-=withdraw;
            }
BigDecimal bd = new BigDecimal(sum);
bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);//精确到小数点后两位,四舍五入
            System.out.println(bd+"---"+day);
        }
        。。。。
    }
}
/*第二种方法*/
import java.text.NumberFormat;
class while2{
    public static void main(String[] args){
        。。。。
        while(true){
            。。。。。
NumberFormat nfm = NumberFormat.getInstance();
nfm.setMaximumFractionDigits(2);//设置数值的小数部分允许的最大位数
nfm.setMinimumFractionDigits(2);//设置数值的小数部分允许的最小位数
            System.out.println(nfm.format(sum)+"---"+day);
        }
       。。。。。
    }
}

------解决思路----------------------
因为计算的时候使用2进制的,,,

分数,取的近似值  1/2 ,1/4,1/8........
0.5刚才是1/2
所以直接可以得到
你可以试试2.25也是可以得到比较准的数字
  相关解决方案