问题描述
把待发金额随机分成n份,每份最小值是0.01元
算法思想
通过随机数来生成每个红包的金额数目,然后将待发金额分成n份
实现过程中的坑
下面以50元分成10份来举例
1.如果将50元依次来进行随机数分配,则会出现在8个人就把50元分配完成了,那么后面两个人都只能得到0元。因此我们不能对50元进行直接分配,我们应该先跟每个人分0.01元,然后把剩下的49.9元再进行分配
2.如果我们通过元来进行金钱划分,则我们需要float/double来进行数据的存储,但是在进行float/doble型的数据运算时会出现浮点数丢失问题,会对我们进行数值运算造成很大的问题。因此我们在涉及金额计算时需要尽量的把它们变成整数则要求我们需要把元变成分来进行计算(把元*100)
3.在计算金额的时候我们不能避免将得到的结果*0.01将其转化为元,这是我们也会出现2中的浮点数精度问题,因此我们需要对所得到的结果进行四舍五入,我们通过java自己提供的DecimalFormat包来对我们所需要输出的结果进行格式化
浮点数计算时精度丢失问题--https://blog.csdn.net/u012671917/article/details/79669578
输出数据格式化问题---https://blog.csdn.net/chuyouyinghe/article/details/51219436
完整源码
import java.util.*;
import java.text.*;
public class xm01 {
public static void main(String[] args) {
System.out.print("输入总钱数和红包总数:");
Scanner input=new Scanner(System.in);
DecimalFormat a = new DecimalFormat(".##");
a.applyPattern("0.00");
double money=input.nextDouble();
int sum=(int) (money*100);
int number=input.nextInt();
System.out.println("每个人的钱数");
for(int i=1;i<=number;i++)
{
int x= (int) (Math.random()*(sum-number));
if(i==number)
{
System.out.print(a.format(sum*0.01)+" ");
break;
}
System.out.print(a.format((x+1)*0.01)+" ");
sum= sum-x-1;
}
}
}