java - 减去 BigDecimal 而不向上舍入

标签 java

我有一个函数,它接收两个 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/

相关文章:

java - 如何调用 Button 元素的另一个 Activity/类 onClick() 中定义的方法?

java - writeUTF 后的额外字符

java - POI DataFormatter 为日期单元格返回 2 位数字年份而不是 4 位数字年份

java - 将选定的控制台输出重定向到文件

java - 修改执行 Jar 文件

java - 给定一组字符串段,有没有办法计算 hashCode 使其等于连接字符串的 hashcode?

java - 如何为 MongoDB 等 NoSql 绘制 UML 图?

java - GSON 无法调用 FloatBuffer 类的无构造函数

Javafx从网格 Pane 中的文本字段获取文本

java - Metro & StreamBuffer 命名空间错误——我理解正确吗?