Java,只提取BigDecimal的小数部分?
在Java中,我使用的是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
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();