我有一个函数,它接收两个 BigDecimal 数字,即 bd1 和 bd2 作为参数。该函数应减去 bd1 - db2 并返回
bd1 和 bd2 的小数位数均为 2,结果的小数位数也应仅为 2 但使用减法会扩展到完整的十进制表示形式 我希望将比例设置为 2 并尝试使用 setScale ,但 setScale 是预期的 舍入模式,不清楚使用哪种舍入模式来获得仅限于比例 2 的精确结果
需要获得精确的相减值 (bd1 - bd2),其比例为 2 。 在这种情况下,我需要 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
最佳答案
您正在使用 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);
关于java - 减去 BigDecimal 而不向上舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48677190/