BigDecimal中使用ROUND_HALF_UP进行四舍五入

发布时间:2024年01月16日

一、BigDecimal 简介
BigDecimal 类位于 java.math 包中,它提供了更加精确的算术运算,使用户完全控制舍入行为。 如果未指定舍入模式,并且无法表示确切的结果,则抛出异常; 否则,可以通过操作提供适当的 MathContext 对象来进行计算,以选择精度和舍入模式。虽然双精度浮点型变量 double 可以处理16位有效数,但在实际应用中可能需要对更大或者更小的数进行运算和处理。一般情况下,对于那些不需要准确计算精度的数字我们可以直接使用 Float 或 Double 处理,但是 Double.valueOf(String) 和Float.valueOf(String) 会丢失精度。如果我们需要精确计算的结果,则必须使用BigDecimal 类来操作。

【注】使用 BigDecimal 进行计算时,我们不能再使用算术运算符(+、-、*、/)进行算数运算,而是使用 BigDecimal 类提供的 add、subtract、multiply、divide 等方法来进行算数运算。

我们这篇讲讲小编在使用BigDecimal中使用ROUND_HALF_UP进行精度遇到的问题。
我们先看下面这段代码的输出:

        BigDecimal bigDecimal=new BigDecimal(3.845);
        System.out.println(bigDecimal);
        System.out.println(bigDecimal.setScale(2,BigDecimal.ROUND_HALF_UP));
        BigDecimal bigDecimal2=new BigDecimal(0.845);
        System.out.println(bigDecimal2);
        System.out.println(bigDecimal2.setScale(2,BigDecimal.ROUND_HALF_UP));

输出的结果:
在这里插入图片描述
我们可以看到,3.845四舍五入的结果是3.85,0.845四舍五入的结果是0.84。

原因:使用参数为float或double的BigDecimal创建对象会丢失精度。因此强烈建议不要使用参数为float或double的BigDecimal创建对象。
解决办法:

  1. 使用BigDecimal(String val)的构造方法创建对象
    new BigDecimal(“3.845”);
    new BigDecimal(“0.845”);
  2. 使用使用BigDecimal的valueOf(double val)方法创建对象
    BigDecimal.valueOf(3.845);
    BigDecimal.valueOf(0.845);
文章来源:https://blog.csdn.net/JSUITDLWXL/article/details/135616491
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。