金额为0.1 个数为10时会出错 原因是bound的值有可能为0 如何解决?
这个问题导致的主要原因是浮点类型不精确的导致的,不妨打印for循环中的各个数值,后边有很长的尾巴,所以要把这些浮点数控制在2位小数以内,利用Math.round函数解决。我的代码如下,同时去掉了bound那个语句,感觉没有必要。
package com.sql.test;
import java.math.BigDecimal;
import java.util.Random;
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
System.out.println("-----微信发红包开始啦-----");
Scanner sc = new Scanner(System.in);
System.out.println("请输入红包金额:");
double total = sc.nextDouble();
System.out.println("请输入红包个数:");
int bigCount = sc.nextInt();
double min = 0.01;
Random c = new Random();
for(int i=1;i<bigCount;i++){
/**
* 此次红包可以输入的最大金额=可用金额-(红包总数-已发的红包)*0.01;
*/
double max = total - (bigCount-i)*min;
//Math.round的存在意义是将浮点数不精确的部分精确到小数点2位,解决0.1对应10个包的极端问题。
max=(double)Math.round(max*100)/100;
//double bound = max - min;
double safe = (double)c.nextInt((int)(max*100))/100;
safe=(double)Math.round(safe*100)/100;
double money = safe + min;
money=(double)Math.round(money*100)/100;
total = total - money;
total=(double)Math.round(total*100)/100;
System.out.println("第"+i+"个红包的金额是"+String.format("%.2f", money)+"元");
}
System.out.println("第"+bigCount+"个红包的金额是"+String.format("%.2f", total)+"元");
}
}