java 如何截断BigDecimal而不进行舍入

ltqd579y  于 2022-12-10  发布在  Java
关注(0)|答案(5)|浏览(206)

在我的代码中进行了一系列计算之后,我得到了一个值为0.01954BigDecimal
然后,我需要将此BigDecimal乘以100,并希望计算出的值为1.95
我不希望执行任何向上或向下舍入,我只希望截断任何超过两位小数的值
我试着将scale设置为2,但是得到了一个ArithmeticException,它说舍入是必要的。如果不指定舍入,我怎么设置scale呢?

6ju8rftf

6ju8rftf1#

请使用舍入模式.DOWN或舍入模式. FLOOR。

BigDecimal newValue = myBigDecimal.setScale(2, RoundingMode.DOWN);
2ekbmq32

2ekbmq322#

使用包含RoundingMode的setScale覆写:

value.setScale(2, RoundingMode.DOWN);
yeotifhr

yeotifhr3#

当我使用一个BigDecimal来设置另一个BigDecimal时,遇到了截断问题。源代码可以包含具有不同十进制值的任何值。

BigDecimal source = BigDecimal.valueOf(11.23); // could 11 11.2 11.234 11.20 etc

为了正确地将其截断和缩放为两位小数,我不得不使用源代码的字符串值,而不是BigDecimal或double值。

new BigDecimal(source.toPlainString()).setScale(2, RoundingMode.FLOOR))

我用这个来表示货币,结果总是有2个小数位。

  • 上午11时至上午11时
  • 十一点二分至十一点二十分
  • 11时234分-〉11时23分
  • 11时238分-〉11时23分
  • 十一时二十分至十一时二十分
but5z9lq

but5z9lq4#

(7.777).setScale(2,舍入模式.向下).stripTrailingZeros()
结果:7.77
(7.7).setScale(2,舍入模式.向下).stripTrailingZeros()
结果:7.7
(77).setScale(2,舍入模式.向下).stripTrailingZeros()
结果:77例

von4xj4u

von4xj4u5#

就我所测试的四舍五入函数而言,它并没有什么魔力。

BigDecimal val2 = new BigDecimal(45.9);
System.out.println(val2.setScale(2,RoundingMode.DOWN));

结果:45.89
最好的方法是从sql端强制转换,或者编写一个util函数,乘以100并传递给一个整数,再除以100并传递给一个BigDecimal。
在我的情况下,我使用

sql:-  CAST(<VALUE> AS decimal(10,2)).

相关问题