Java,只提取BigDecimal的小数部分?

Fra*_*lin 57 java bigdecimal

在Java中,我正在使用BigDecimal该类,我的部分代码要求我从中提取小数部分. BigDecimal似乎没有任何内置的方法来帮助我获得小数点后的数字BigDecimal.

例如:

BigDecimal bd = new BigDecimal("23452.4523434");
Run Code Online (Sandbox Code Playgroud)

我想4523434从上面提到的数字中提取出来.最好的方法是什么?

Tay*_*mon 86

我会试试bd.remainder(BigDecimal.ONE).

使用remainder方法和ONE常量.

BigDecimal bd = new BigDecimal( "23452.4523434" );
BigDecimal fractionalPart = bd.remainder( BigDecimal.ONE ); // Result:  0.4523434
Run Code Online (Sandbox Code Playgroud)

  • @Franklin - 请不接受我的回答,而是接受Taymon的回答,因为它比我的更清洁,整体更好.1+到Taymon. (10认同)
  • 当前解决方案的代码将返回"0.4523434",而不是作者想要的"4523434".将需要更多的动作. (8认同)
  • 重要的是在某些情况下只获得"4523434",这个答案不会返回正确的结果,也应该打印输出. (2认同)

Iva*_*nRF 13

如果值为负,则使用bd.subtract()将返回错误的小数.

使用这个:

BigInteger decimal = 
                bd.remainder(BigDecimal.ONE).movePointRight(bd.scale()).abs().toBigInteger();
Run Code Online (Sandbox Code Playgroud)

它返回452343423452.4523434-23452.4523434


此外,如果您不想在小数部分的右侧添加额外的零,请使用:

bd = bd.stripTrailingZeros();
Run Code Online (Sandbox Code Playgroud)

在上一个代码之前.

  • 虽然您的代码在形式上是正确的,但实际上并非如此。想象一下输入是 `BigDecimal("123.45").setScale(6)` 然后你会得到 `450000`。几乎没有一个有用的结果。 (2认同)
  • @PavelVlasov 要解决您的问题,请在我的代码之前应用 `bd = bd.stripTrailingZeros();`。 (2认同)
  • 这里要小心!如果您有“5.009”,您将得到“9” (2认同)

sha*_*ams 7

这是使用该remainder()方法的替代方法:

BigDecimal bd = new BigDecimal("23452.4523434");
BigDecimal fracBd = bd.subtract(new BigDecimal(bd.toBigInteger()));
Run Code Online (Sandbox Code Playgroud)

此外,您可以尝试使用abs()方法来确保小数部分是正数:

BigDecimal fracBd = bd.subtract(new BigDecimal(bd.toBigInteger())).abs();
Run Code Online (Sandbox Code Playgroud)

  • 不只提取“4523434”,这不是正确的答案 (3认同)

小智 6

这不起作用!

BigDecimal d = BigDecimal.valueOf(23452.4523434);
BigInteger decimal = 
d.remainder(BigDecimal.ONE).movePointRight(d.scale()).abs().toBigInteger();
Run Code Online (Sandbox Code Playgroud)

当您输入数字时,哪个小数部分以“0”开头,例如。“123.00456”。您会得到“456”而不是“00456”。发生这种情况是因为我们对其进行了转换.toBigInteger(),而第一个零就消失了;如果你使用.toString()代替.toBigInteger(),你会得到 456.00000,这也是错误的!

所以我的建议是使用这个

BigDecimal fractPart = bd.remainder(BigDecimal.ONE);
StringBuilder sb = new StringBuilder(fractPart.toString());
sb.delete(0, 2);
String str = sb.toString();
Run Code Online (Sandbox Code Playgroud)

然后按照str你想要的方式使用它