如何截断BigDecimal而不进行舍入

JJ1*_*180 34 java rounding bigdecimal arithmeticexception

在我的代码中进行了一系列计算之后,我有了一个BigDecimal有价值的东西0.01954

然后我需要将其乘以BigDecimal,100并希望计算值为1.95

我不希望执行任何向上或向下舍入,我只是希望截断超过两位小数的任何值

我尝试将比例设置为2,但后来我得到一个ArithmeticException说法四舍五入是必要的.如何在不指定舍入的情况下设置比例?

Gri*_*Dog 58

使用RoundingMode.DOWNRoundingMode.FLOOR.

BigDecimal newValue = myBigDecimal.setScale(2, RoundingMode.DOWN);
Run Code Online (Sandbox Code Playgroud)

  • @user666您正在使用采用浮点值的构造函数,该浮点值本身可能存在舍入误差。使用采用 `String` 的构造函数: `new BigDecimal("4343.33").setScale(2, RoundingMode.DOWN)` (2认同)

小智 9

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

BigDecimal source = BigDecimal.valueOf(11.23); // could 11 11.2 11.234 11.20 etc
Run Code Online (Sandbox Code Playgroud)

为了正确截断和缩放两位小数,我必须使用源的字符串值而不是 BigDecimal 或 double 值。

new BigDecimal(source.toPlainString()).setScale(2, RoundingMode.FLOOR))
Run Code Online (Sandbox Code Playgroud)

我用它来表示货币,这总是会产生带有 2 位小数的值。

  • 11 -> 11.00
  • 11.2 -> 11.20
  • 11.234 -> 11.23
  • 11.238 -> 11.23
  • 11.20 -> 11.20


use*_*075 8

使用包含RoundingMode的setScale覆盖:

value.setScale(2, RoundingMode.DOWN);
Run Code Online (Sandbox Code Playgroud)