首页 文章

减去BigDecimal而不进行舍入

提问于
浏览
0

我有一个函数接收两个BigDecimal数字,说bd1和bd2作为参数 . 该函数应减去bd1 - db2并返回

bd1和bd2的比例都是2,结果也应该只有2的比例但是使用减法是缩小到完整的十进制表示我希望比例设置为2并尝试使用setScale,但是setScale正在考虑舍入模式并且不清楚哪个舍入模式用于获得限制为2的精确结果

需要获得具有2的精确减去值(bd1-bd2) . 在这种情况下,我需要15.04没有舍入,因为我从另一个应用程序获取这些值,我不想通过添加舍入模式更改值

BigDecimal bd1 = new BigDecimal(30.18);
    BigDecimal bd2 = new BigDecimal(15.14);

    BigDecimal diff =  bd1.subtract(bd2);
    System.out.println("bd1.subtract(bd2)       " + diff);   

    System.out.println("RoundingMode.DOWN       " + diff.setScale(2, RoundingMode.DOWN));
    System.out.println("RoundingMode.FLOOR      "  + diff.setScale(2, RoundingMode.FLOOR));

    System.out.println("RoundingMode.UP         " +diff.setScale(2, RoundingMode.UP));

    System.out.println("RoundingMode.CEILING    " + diff.setScale(2, RoundingMode.CEILING));

    System.out.println("RoundingMode.HALF_UP    " + diff.setScale(2, RoundingMode.HALF_UP));



Result
------
bd1.subtract(bd2)       15.03999999999999914734871708787977695465087890625
RoundingMode.DOWN       15.03
RoundingMode.FLOOR      15.03
RoundingMode.UP         15.04
RoundingMode.CEILING    15.04
RoundingMode.HALF_UP    15.04

实际结果是15.04

1 回答

  • 1

    您正在使用 double 初始化 BigDecimal ,因此它没有足够的精度 . 使用 String 作为构造函数的参数:

    BigDecimal bd1 = new BigDecimal("30.18");
    BigDecimal bd2 = new BigDecimal("15.14");
    
    BigDecimal diff =  bd1.subtract(bd2);
    System.out.println("bd1.subtract(bd2)  " + diff);
    

相关问题