我想从java中的bigdecimal中提取整数部分和小数部分.
我正在使用以下代码.
BigDecimal bd = BigDecimal.valueOf(-1.30)
String textBD = bd.toPlainString();
System.out.println("length = "+textBD.length());
int radixLoc = textBD.indexOf('.');
System.out.println("Fraction "+textBD.substring(0,radixLoc)+"Cents: " + textBD.substring(radixLoc + 1, textBD.length()));
Run Code Online (Sandbox Code Playgroud)
我得到的输出为
-1和3
但我希望尾随零也从-1.30开始
输出应为-1和30
如果您不想参与字符串(我认为这不是一个好习惯 - 除了创建 de BigDecimal 的部分),您可以只使用 Math:
// [1] Creating and rounding (just like GriffeyDog suggested) so you can sure scale are 2
BigDecimal bd = new BigDecimal("-1.30").setScale(2, RoundingMode.HALF_UP);
// [2] Fraction part (0.30)
BigDecimal fraction = bd.remainder(BigDecimal.ONE);
// [3] Fraction as integer - move the decimal.
BigDecimal fraction2 = fraction.movePointRight(bd.scale());
// [4] And the Integer part can result of:
BigDecimal natural = bd.subtract(fraction);
// [5] Since the fraction part of 'natural' is just Zeros, you can setScale(0) without worry about rounding
natural = natural.setScale(0);
Run Code Online (Sandbox Code Playgroud)
我知道,我的英语很糟糕。如果你能理解我想说的话,请随时纠正。谢谢。
-1.30的浮点表示形式不正确。这是您的代码的略微修改:
BigDecimal bd = new BigDecimal("-1.30").setScale(2, RoundingMode.HALF_UP);
String textBD = bd.toPlainString();
System.out.println("text version, length = <" + textBD + ">, " + textBD.length());
int radixLoc = textBD.indexOf('.');
System.out.println("Fraction " + textBD.substring(0, radixLoc)
+ ". Cents: " + textBD.substring(radixLoc + 1, textBD.length()));
Run Code Online (Sandbox Code Playgroud)
我在setScale上放了一个RoundingMode以将小数便士(例如1.295)“减半”到1.30。
结果是:
text version, length = <-1.30>, 5
Fraction -1. Cents: 30
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8667 次 |
| 最近记录: |