在Java中,我正在使用BigDecimal
类,我的部分代码要求我从中提取小数部分。 BigDecimal
似乎没有任何内置方法可以帮助我获取BigDecimal
小数点后的数字。
例如:
BigDecimal bd = new BigDecimal("23452.4523434");
我想从上面代表的数字中提取4523434
。最好的方法是什么?
答案 0 :(得分:83)
我会尝试bd.remainder(BigDecimal.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();
返回4523434
或23452.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