微信发红包问题

问题描述

              把待发金额随机分成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;
			
		} 
}
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值