当前位置: 首页 > 知识库问答 >
问题:

减去BigDecimal而不四舍五入

凌华奥
2023-03-14

我有一个函数,它接收两个大十进制数,即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个答案

楚威
2023-03-14

您正在使用双精度初始化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);
 类似资料:
  • 我正在使用BigDecimal在我的应用程序中处理正数,我想让它在第4个之后截断小数。我似乎几乎找到了我想要的RoundingMode。向下,但当BigDecimal是从双精度创建时存在一些问题。 例如: 但是,以下打印的是123.1110,这根本不是我想要的:

  • 我一直在尝试在java中使用bigdecimal进行取整,并遇到了一个java。显示非终止十进制扩展的lang.ArithmeticException错误。 谁能解释一下这个错误的起源吗?因为我对java还很陌生?帮我写代码? 谢谢 变量“d”是我认为产生错误的地方。

  • 问题内容: 我将以下代码与具有Half_even舍入模式的Java BigDecimal setScale方法配合使用,并获得以下结果。 结果:1.11 预期值:1.12 由于最接近5的偶数应该是2,因此我期望的结果是1.12。但是结果是1.11。然后再次, 结果:1.15 预期值:1.14 因为5左边的偶数是4,所以我期望结果是1.14。有什么解释吗? 问题答案: 这是由浮点不精确(在您的输入值

  • 我正在创建一个用百分比计算分数平均值的应用程序,但问题是BigDecimal并不总是对平均值进行四舍五入,例如,如果分数平均值是3.85 BigDecimal ROUND\u HALF\u,那么在量表1中应该四舍五入到3.9,但它显示的平均值像3.8,这只发生在某些特定的时间,有时BigDecimal ROUND 4.95,比如5.0,这很好,但我不知道为什么会这样,问题出在哪里。这是一个示例代码

  • 本节讨论了精度数学的四舍五入特性,ROUND()函数,以及插入DECIMAL列时的四舍五入特性。 ROUND()函数的行为取决于其参量是准确的还是近似的: ·对于准确值数值,ROUND()采用“半值向上舍入”规则:如果小数部分的值为.5或更大,如果是正数,向上取下一个整数,如果是负数,向下取下一个整数(换句话讲,以0为界限执行舍入)。如果小数部分的值小于.5,如果是正数,向下取下一个整数,如果是负

  • 问题内容: 我需要以下结果 还是?我该怎么办? 问题答案: 您可以使用将小数位数减少为零。假设拥有要取整的值: 使用起来有点麻烦,因为它要求您指定要保留的位数。在您的示例中,该值为3,但这不适用于所有值: (请注意,对象是不可改变的,都和会返回一个新的对象。)