BigDecimal相关
BigDecimal相关
Calyee留意
浮点类型
高精度之精度丢失
1 | // 用法一 |
对应的结果如下:
a: 0.01000000000000000020816681711721685132943093776702880859375
b: 0.01
那么: 在new BigDecimal
的时候传入的已经是浮点类型( 近似值 )了, 而在使用valueOf
的时候, 通过阅读源码可知
1 | public static BigDecimal valueOf(double val) { |
在valueOf的方法内部, 调用了Double.toString方法转换成为了字符串, 转换成为字符串就不存在进度丢失问题 (因为可以使用字符串模拟高精度实现计算: 梦回c语言高精度实现)
那么我们需要使用则: (两个方向)
- 创建对象时, 构造函数传字符串
- 使用BigDecimal.valueOf传值初始化对象
精度设置
其实就是四舍五入的问题
1 | BigDecimal a = new BigDecimal("1.0"); |
例如我们需要运算
1 | a.divide(b); |
然后就会抛出异常: ArithmeticException
因为它(结果)是一个无限循环小数, 它不能转换成为我们预期的精确数字
所以需要指定精度
1 | BigDecimal c = a.divide(b, 4,RoundingMode.HALF_UP); |
- 4: 四位小数
- RoundingMode.HALF_UP: HALF_UP-> 大于一半则向上取整
故结果为: 0.3333
其中RoundingMode还有很多枚举, 自行查阅
浮点比较
比较BigDecimal值的大小
1 | BigDecimal a = new BigDecimal("0.01"); |
然后有两种比较方法
1 | a.equals(b) |
其中一看好像没什么区别, 查阅源码( equals )可知
1 |
|
compareTo则是实现比较值的大小, 返回的值为-1(小于),0(等于),1(大于)
我们可以知道, 如果在严格要求精度的情况下, 使用equals
如果仅考虑值的大小则考虑使用 compareTo
输出格式化
此处仅给出几个示例:
1 | NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立货币格式化引用 |
输出:
1 | 金额: ¥59,988.24 |
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果