官方实现
算法原理:
- 抢红包的期望收益应与先后顺序无关
- 保证每个用户至少能抢到一个预设的最小金额,人民币红包设置的最小金额一般是0.01元。如果需要发其他货币类型的红包,比如区块链货币或者积分,需要自定义一个最小金额。
2025年06月04日
算法原理:
2025年06月04日
前言:
接着上篇的文档来写继续写设计模式。
观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。SpringBoot中的事件机制是观察者模式的典型应用,如ApplicationEvent和ApplicationListener。
2025年06月04日
如果基本的整数和浮点数精度不能满足需求,就可以使用java.math包中的两个很有用的类:
BigInteger和BigDecimal。这两个类可以处理任意长度的数值。BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。
使用静态的valueOf方法可以把普通的数值转换为大数值:
2025年06月04日
今天在计算库存消耗百分比(消耗的库存/总库存)的时候遇到了一个错误,
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
2025年06月04日
1、两数相除无限循环小数问题
直接看例子01:
@Test
public void BigNumber_Test () {
BigDecimal bd = new BigDecimal("10");
BigDecimal divNum = new BigDecimal("3");
// 除法遇到除不尽时,这种写法会抛出异常ArithmeticException
BigDecimal bigDecimal = bd.divide(divNum); // NG java.lang.ArithmeticException
System.out.println(bd.divide(divNum, 2)); // OK
System.out.println(bd.divide(divNum, 2, BigDecimal.ROUND_UP)); // OK
System.out.println(bd.divide(divNum, 2, BigDecimal.ROUND_DOWN)); // OK
System.out.println(bd.divide(divNum, 2, BigDecimal.ROUND_CEILING)); // OK
System.out.println(bd.divide(divNum, 2, BigDecimal.ROUND_FLOOR)); // OK
System.out.println(bd.divide(divNum, 2, BigDecimal.ROUND_HALF_UP)); // OK
System.out.println(bd.divide(divNum, 2, BigDecimal.ROUND_HALF_EVEN)); // OK
System.out.println(bd.divide(new BigDecimal("4"), 2, BigDecimal.ROUND_UNNECESSARY)); // OK
}
2025年06月04日
加法:add 减法:subtract 乘法:multiply 除法:divide
BigDecimal bd1 = new BigDecimal("15");
BigDecimal bd2 = new BigDecimal("20");
BigDecimal bd3;