微信抢红包的BUG
还有0人有此问题
发表在Java视频课程答疑 2017-01-17
是否精华
版块置顶:

金额为0.1 个数为10时会出错 原因是bound的值有可能为0 如何解决?

2017-01-17 11:08:43编辑
分享到:
精彩评论 2
David
学分:914 LV7
TA的每日心情
最后的冲刺
2017-07-15 10:46:08
2017-01-17
沙发

2.png由于红包的最小金额为0.01元,所以这里添加了两个约束条件:(1)当每个红包的金额等于最小金额0.01元时;(2)当每个红包的金额小于最小金额0.01元时。

fantish
学分:79 LV3
2017-05-25
板凳

这个问题导致的主要原因是浮点类型不精确的导致的,不妨打印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)+"元");

}

}


首页上一页 1 下一页尾页 2 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照