63

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

例如:

BigDecimal bd = new BigDecimal("23452.4523434");

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

4

4 回答 4

104

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

使用remainder方法和ONE常数。

BigDecimal bd = new BigDecimal( "23452.4523434" );
BigDecimal fractionalPart = bd.remainder( BigDecimal.ONE ); // Result:  0.4523434
于 2012-04-06T03:24:27.677 回答
16

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

使用这个

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

它返回452343423452.4523434-23452.4523434


此外,如果您不希望小数部分右侧有多余的零,请使用:

bd = bd.stripTrailingZeros();

在前面的代码之前。

于 2015-06-10T15:47:44.757 回答
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();
于 2012-04-06T04:06:51.947 回答
2

它不起作用!

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你想要的方式使用它

于 2019-07-23T14:11:59.263 回答