BigDecimal的正确打开方式

前言

项目中明确规定,凡是涉及到金额的属性定义都必须使用BigDecimal类型,这里来和大家一起学习下BigDecimal的正确打开方式。

先来个错误的示范

话不多说,直接上demo

    @Test
    public void wrongUseDecimal() {
        BigDecimal test1 = new BigDecimal(1.745);
        BigDecimal test2 = new BigDecimal(0.745);
        test1 = test1.setScale(2, BigDecimal.ROUND_HALF_UP);
        test2 = test2.setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println(test1);
        System.out.println(test2);
    }

上面是对1.745和0.745四舍五入保留两位有效数字,输出结果如下

1.75
0.74

使用参数为float或double的BigDecimal创建对象会丢失精度。

System.out.println(new BigDecimal(1.745)); 
// 1.74500000000000010658141036401502788066864013671875
System.out.println(new BigDecimal(0.745)); 
// 0.74499999999999999555910790149937383830547332763671875

如上面所示,因为精度丢失,所以在四舍五入的时候没有达到预期目标。大家不要觉得不就相差0.01么,影响不大吧,但是如果这两个数字后面的单位是亿呢?因此强烈建议不要使用参数为float或double的BigDecimal创建对象。

正确使用姿势

//使用BigDecimal(String val)的构造方法创建对象
new BigDecimal("1.745");
new BigDecimal("0.745");
//使用使用BigDecimal的valueOf(double val)方法创建对象
BigDecimal.valueOf(1.745);
BigDecimal.valueOf(0.745);

拓展DecimalFormat

DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。该类设计有各种功能,使其能够解析和格式化任意语言环境中的数,包括对西方语言、阿拉伯语和印度语数字的支持。它还支持不同类型的数,包括整数 (123)、定点数 (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。

符号 位置 本地化? 含义
0 数字 阿拉伯数字
# 数字 阿拉伯数字如果不存在就显示为空
. 数字 小数分隔符或货币小数分隔符
- 数字 减号
, 数字 分组分隔符
E 数字 分割科学技术法中的尾数和指数。在前缀和后缀中无需添加引号
; 子模式边界 分隔正数和负数子模式
% 前缀或后缀 乘以100并显示为百分数
/u2030 前缀或后缀 乘以1000并显示为千分数
¤ (\u00A4) 前缀或后缀 货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符
' 前缀或后缀 用于在前缀或或后缀中为特殊字符加引号,例如 "'#'#" 将 123 格式化为 "#123"。要创建单引号本身,请连续使用两个单引号:"# o''clock"

测试Demo如下

double pi = 3.1415927;//圆周率
//取一位整数
System.out.println(new DecimalFormat("0").format(pi));//3
//取一位整数和两位小数
System.out.println(new DecimalFormat("0.00").format(pi));//3.14
//取两位整数和三位小数,整数不足部分以0填补。
System.out.println(new DecimalFormat("00.000").format(pi));// 03.142
//取所有整数部分
System.out.println(new DecimalFormat("#").format(pi));//3
//以百分比方式计数,并取两位小数
System.out.println(new DecimalFormat("#.##%").format(pi));//314.16%

小知识,大家也不可忽视呀!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章