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

时间:2012-04-06 03:20:50

标签: java bigdecimal

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

例如:

BigDecimal bd = new BigDecimal("23452.4523434");

我想从上面代表的数字中提取4523434。最好的方法是什么?

5 个答案:

答案 0 :(得分:83)

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

使用remainder方法和ONE常量。

BigDecimal bd = new BigDecimal( "23452.4523434" );
BigDecimal fractionalPart = bd.remainder( BigDecimal.ONE ); // Result:  0.4523434

答案 1 :(得分:12)

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

使用此

BigInteger decimal = 
                bd.remainder(BigDecimal.ONE).movePointRight(bd.scale()).abs().toBigInteger();

返回452343423452.4523434

-23452.4523434

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

bd = bd.stripTrailingZeros();

之前的代码。

答案 2 :(得分:7)

以下是使用remainder()方法的替代方法:

BigDecimal bd = new BigDecimal("23452.4523434");
BigDecimal fracBd = bd.subtract(new BigDecimal(bd.toBigInteger()));

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

BigDecimal fracBd = bd.subtract(new BigDecimal(bd.toBigInteger())).abs();

答案 3 :(得分:3)

此返回“4523434”,即使您将数字设置为负数“-23452.4523434”。

 BigDecimal d = BigDecimal.valueOf(23452.4523434);
 BigInteger decimal = d.remainder(BigDecimal.ONE).movePointRight(d.scale()).abs().toBigInteger();

答案 4 :(得分:0)

它不起作用!!!

BigDecimal d = BigDecimal.valueOf(23452.4523434);
BigInteger decimal = 
d.remainder(BigDecimal.ONE).movePointRight(d.scale()).abs().toBigInteger();

例如,输入数字时,小数部分以“ 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();

然后随便使用此str