当前位置:   article > 正文

BigDecimal四舍五入用法介绍_bigdecimal 四舍五入

bigdecimal 四舍五入

一、BigDecimal四舍五入保留两位小数

import java.math.BigDecimal;
 
public class Test {
    public static void main(String[] args) {
        BigDecimal bd = new BigDecimal("3.1415926");
        bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println(bd);   //输出结果为3.14
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

BigDecimal.setScale() 方法可以将 BigDecimal 对象四舍五入后保留指定小数位数,其中第一个参数表示小数点后保留的位数,第二个参数表示使用四舍五入策略。

其中,ROUND_HALF_UP 是 BigDecimal 官方提供的四舍五入策略,表示直接将舍去部分加 0.5 后再进行向上舍入。

二、BigDecimal四舍五入保留一位小数

import java.math.BigDecimal;
 
public class Test {
    public static void main(String[] args) {
        BigDecimal bd = new BigDecimal("3.1415926");
        bd = bd.setScale(1, BigDecimal.ROUND_HALF_UP);
        System.out.println(bd);   //输出结果为3.1
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

同上,只需要将第一个参数改为1即可。

三、BigDecimal四舍五入方法

假设有一个 BigDecimal 对象 bd,想对其保留两位小数并使用四舍五入策略,可以使用以下代码:

bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP);
  • 1

具体可选的四舍五入策略有:

ROUND_UP:向上舍入
ROUND_DOWN:向下舍入
ROUND_CEILING:向正无穷舍入
ROUND_FLOOR:向负无穷舍入
ROUND_HALF_UP:四舍五入
ROUND_HALF_DOWN:五舍六入
ROUND_HALF_EVEN:银行家舍入
ROUND_UNNECESSARY:不需要舍入

四、BigDecimal四舍五入模式

在使用 BigDecimal.setScale() 方法时,有一些小细节需要注意,例如当要保留的小数位数为 0 时,需要使用 ROUND_HALF_UP 模式才能正确进行四舍五入:

BigDecimal bd = new BigDecimal("3.1415926");
bd = bd.setScale(0, BigDecimal.ROUND_HALF_UP);
System.out.println(bd);   //输出结果为3
  • 1
  • 2
  • 3

如果改为使用 ROUND_HALF_DOWN 模式,则会出现以下错误:

BigDecimal bd = new BigDecimal("3.1415926");
bd = bd.setScale(0, BigDecimal.ROUND_HALF_DOWN);
System.out.println(bd);   //输出结果为4
  • 1
  • 2
  • 3

因此,在使用 BigDecimal.setScale() 方法时,需要根据具体情况选择正确的四舍五入模式。

五、BigDecimal四舍五入规则

当进行 BigDecimal 四舍五入时,需要遵守以下规则:

如果舍去部分小于 0.5,则直接舍去。
如果舍去部分等于 0.5,且舍去部分前一位是偶数,则直接舍去。
如果舍去部分等于 0.5,且舍去部分前一位是奇数,则进位。

六、BigDecimal四舍五入精度丢失

在进行 BigDecimal 运算时,可能会出现精度丢失的情况,例如以下代码:

BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
System.out.println(a.subtract(b));   //输出结果为0.09999999999999997779553950749686919152736663818359375

  • 1
  • 2
  • 3
  • 4

此时可以使用 BigDecimal.setScale() 方法来解决精度丢失问题:

BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
BigDecimal c = a.subtract(b).setScale(1, BigDecimal.ROUND_HALF_UP);
System.out.println(c);   //输出结果为0.1
  • 1
  • 2
  • 3
  • 4

七、BigDecimal四舍五入保留整数

如果要将 BigDecimal 对象四舍五入保留整数,可以使用以下代码:


BigDecimal bd = new BigDecimal("3.1415926");
bd = bd.setScale(0, BigDecimal.ROUND_HALF_UP);
System.out.println(bd);   //输出结果为3
  • 1
  • 2
  • 3
  • 4

八、BigDecimal位数
在使用 BigDecimal 进行运算时,要注意位数问题,否则可能会出现意想不到的结果。例如:

BigDecimal a = new BigDecimal("1000000000000");
BigDecimal b = new BigDecimal("0.0000000001");
System.out.println(a.add(b));   //输出结果为1000000000000
  • 1
  • 2
  • 3

此时可以使用 BigDecimal 的 setScale() 方法限定小数位数,以保证正确的运算结果:

BigDecimal a = new BigDecimal("1000000000000");
BigDecimal b = new BigDecimal("0.0000000001");
BigDecimal c = a.add(b).setScale(10, BigDecimal.ROUND_HALF_UP);
System.out.println(c);   //输出结果为1000000000000.0000000001

  • 1
  • 2
  • 3
  • 4
  • 5

九、BigDecimal除法四舍五入

在进行 BigDecimal 除法运算时,默认情况下不会进行四舍五入,例如:

BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("3");
BigDecimal c = a.divide(b);
System.out.println(c);   //输出结果为3.33333333333333333333333333333333333333333333333333333333333333333333333333333333
  • 1
  • 2
  • 3
  • 4

此时可以使用 BigDecimal.setScale() 方法来解决除法四舍五入问题:

BigDecimal a = new BigDecimal("10");
BigDecimal b = new BigDecimal("3");
BigDecimal c = a.divide(b, 2, BigDecimal.ROUND_HALF_UP);
System.out.println(c);   //输出结果为3.33
  • 1
  • 2
  • 3
  • 4

十、BigDecimal的加减乘除

在进行 BigDecimal 加减乘除运算时,需要注意保留小数位数和四舍五入的问题。例如:

BigDecimal a = new BigDecimal("3.1415926");
BigDecimal b = new BigDecimal("2.7182818");
BigDecimal c = a.add(b);   //加法运算
c = c.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(c);   //输出结果为5.86
 
BigDecimal d = a.subtract(b);   //减法运算
d = d.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(c);   //输出结果为0.42
 
BigDecimal e = a.multiply(b);   //乘法运算
e = e.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(e);   //输出结果为8.53
 
BigDecimal f = a.divide(b, 2, BigDecimal.ROUND_HALF_UP);   //除法运算
System.out.println(f);   //输出结果为1.16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

总之,在进行 BigDecimal 四舍五入相关操作时,需要注意精度、位数和模式等问题,以保证正确的运算结果。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/319859
推荐阅读
  

闽ICP备14008679号