我有一个函数,它接收两个大十进制数,即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
您正在使用双精度
初始化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,但这不适用于所有值: (请注意,对象是不可改变的,都和会返回一个新的对象。)