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也是可以得到比较准的数字