用BigDecimal限制重要数字的任何巧妙方法

Mar*_*ide 6 java bigdecimal

我想将Java BigDecimal舍入到一定数量的有效数字(非小数位),例如4位数:

12.3456 => 12.35

123.456 => 123.5

123456 => 123500

基本问题是如何找到BigDecimal的数量级,因此我可以决定小数点后使用的位数.

我能想到的只是一个可怕的循环,除以10直到结果<1,我希望有更好的方法.

顺便说一句,这个数字可能非常大(或非常小)所以我无法将其转换为双倍以使用登录它.

A.H*_*.H. 11

easierst解决方案是:

  int newScale = 4-bd.precision()+bd.scale();
  BigDecimal bd2 = bd1.setScale(newScale, RoundingMode.HALF_UP);
Run Code Online (Sandbox Code Playgroud)

不需要字符串转换,它完全基于BigDecimal算术,因此尽可能高效,您可以选择它RoundingMode并且它很小.如果输出应该是a String,只需追加即可.toPlainString().


Kru*_*Kru 11

为什么不用round(MathContext)

BigDecimal value = BigDecimal.valueOf(123456);
BigDecimal wantedValue = value.round(new MathContext(4, RoundingMode.HALF_UP));
Run Code Online (Sandbox Code Playgroud)


How*_*ard 5

您可以使用以下行:

int digitsRemain = 4;

BigDecimal bd = new BigDecimal("12.3456");
int power = bd.precision() - digitsRemain;
BigDecimal unit = bd.ulp().scaleByPowerOfTen(power);
BigDecimal result = bd.divideToIntegralValue(unit).multiply(unit);
Run Code Online (Sandbox Code Playgroud)

注意:此解决方案始终向下舍入到最后一位数.