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

Java,只提取BigDecimal的小数部分?,java,bigdecimal,Java,Bigdecimal,在Java中,我使用的是BigDecimal类,部分代码需要从中提取小数部分BigDecimal似乎没有任何内置方法来帮助我获取BigDecimal小数点后的数字 例如: BigDecimal bd = new BigDecimal("23452.4523434"); 我想从上面表示的数字中提取4523434。最好的方法是什么?我会尝试bd.rements(BigDecimal.ONE) 使用方法和常量 BigDecimal bd = new BigDecimal( "23452.452343

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

例如:

BigDecimal bd = new BigDecimal("23452.4523434");

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

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

使用方法和常量

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

下面是使用
rementis()
方法的替代方法:

BigDecimal bd = new BigDecimal("23452.4523434");
BigDecimal fracBd = bd.subtract(new BigDecimal(bd.toBigInteger()));
此外,您可以尝试abs()方法以确保分数部分为正值:

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

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

使用这个

BigInteger decimal = bd.remainder(BigDecimal.ONE).movePointRight(bd.scale()).abs().toBigInteger();
对于
23452.4523434
-23452.4523434


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

bd = bd.stripTrailingZeros();
在前面的代码之前。

它不工作

BigDecimal d = BigDecimal.valueOf(23452.4523434);
BigInteger decimal = 
d.remainder(BigDecimal.ONE).movePointRight(d.scale()).abs().toBigInteger();
输入数字时,哪个小数部分以“0”开头,例如“123.00456”。 你得到的是“456”而不是“00456”。 发生这种情况是因为我们将其转换为
.toBigInteger()
,而第一个零刚刚消失; 如果您使用
.toString()
而不是
.tobiginger()
,您将获得456.00000,这也是错误的

因此,我的建议是:


然后用这个
str
你想怎么做

@Franklin--请不要接受我的答案,而是接受Taymon的答案,因为它比我的答案更干净,总体上更好。当前解决方案的代码将返回“0.4523434”,而不是作者想要的“4523434”。需要更多的动作。在某些情况下,只获取“4523434”是很重要的,这个答案不会返回正确的结果,也应该打印输出。没有数学上下文的减法可能会导致一些有趣的结果。不要只提取“4523434”,这不是正确的答案,而代码在形式上是正确的,事实并非如此。假设输入是
BigDecimal(“123.45”)。设置刻度(6)
,那么您将得到
450000
。这几乎不是一个有用的结果。@PavelVlasov,这个数字仍然是小数部分,这是最初的问题。“小数部分”右侧的每个零都是无用的,因此在这种情况下,
45
450000
是相等的。@PavelVlasov要解决您的问题,请应用
bd=bd.stripTrailingZeros()在我的代码之前。感谢您提供的剥离功能。顺便说一句,这样的代码在需要拼写数字(美分)时很有用。
BigDecimal fractPart = bd.remainder(BigDecimal.ONE);
StringBuilder sb = new StringBuilder(fractPart.toString());
sb.delete(0, 2);
String str = sb.toString();