删除 BigDecimal 中逗号后面的前导零
Remove leading zeros behind comma in BigDecimal
我有 2 个 BigDecimals,我想为两个数字删除相同数量的前导零,即使是逗号后面的那些。如果没有昂贵的 toString 转换,有没有办法做到这一点?
以下是我希望它看起来像的一些示例:
0.0004 -> 0.4
逗号后面有 3 个零,所以我也想去掉另一个逗号后面的 3 个零:
0.00003 -> 0.03
尝试 DecimalFormat,查看 url
http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html
像下面这样玩 BigDecimal
DecimalFormat nf = new DecimalFormat("##,###.###");
nf.setParseBigDecimal(true);
BigDecimal bd = ((BigDecimal) nf.parse("10,233.907")).setScale(3,BigDecimal.ROUND_HALF_UP);
我想你可以使用 movePointRight
方法。以下是javarepl
输出。
java> BigDecimal a = new BigDecimal("0.0004");
java.math.BigDecimal a = 0.0004
java> a.movePointRight(3);
java.math.BigDecimal res2 = 0.4
java> BigDecimal b = new BigDecimal("0.00003");
java.math.BigDecimal b = 0.00003
java> b.movePointRight(3);
java.math.BigDecimal res4 = 0.03
取较大的数,迭代应用movePointRight,同时与0.1
比较,知道什么时候停止。然后在较小的数字上将点向右移动相同的量。
这里有一个简单的建议
BigDecimal a = new BigDecimal("0.0004");
BigDecimal b = new BigDecimal("10000.000003");
final BigInteger aInteger = a.abs().toBigInteger();
final BigDecimal aDecimal = a.subtract(new BigDecimal(aInteger));
final BigInteger bInteger = b.abs().toBigInteger();
final BigDecimal bDecimal = b.subtract(new BigDecimal(bInteger));
final BigDecimal x = aDecimal.compareTo(bDecimal) > 1 ? b : a;
BigDecimal DECIMAL = x.subtract(new BigDecimal(x.abs().toBigInteger()));
int count = 0;
final BigDecimal one = new BigDecimal(1);
while (DECIMAL.multiply(new BigDecimal(10)).compareTo(one) < 0) {
count++;
DECIMAL = DECIMAL.multiply(new BigDecimal(10));
}
a = new BigDecimal(aInteger).add(aDecimal.movePointRight(count));
b = new BigDecimal(bInteger).add(bDecimal.movePointRight(count));
System.out.println("a =" + a + " b = " + b);
你可以做得更好
我有 2 个 BigDecimals,我想为两个数字删除相同数量的前导零,即使是逗号后面的那些。如果没有昂贵的 toString 转换,有没有办法做到这一点? 以下是我希望它看起来像的一些示例:
0.0004 -> 0.4
逗号后面有 3 个零,所以我也想去掉另一个逗号后面的 3 个零:
0.00003 -> 0.03
尝试 DecimalFormat,查看 url http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html
像下面这样玩 BigDecimal
DecimalFormat nf = new DecimalFormat("##,###.###");
nf.setParseBigDecimal(true);
BigDecimal bd = ((BigDecimal) nf.parse("10,233.907")).setScale(3,BigDecimal.ROUND_HALF_UP);
我想你可以使用 movePointRight
方法。以下是javarepl
输出。
java> BigDecimal a = new BigDecimal("0.0004");
java.math.BigDecimal a = 0.0004
java> a.movePointRight(3);
java.math.BigDecimal res2 = 0.4
java> BigDecimal b = new BigDecimal("0.00003");
java.math.BigDecimal b = 0.00003
java> b.movePointRight(3);
java.math.BigDecimal res4 = 0.03
取较大的数,迭代应用movePointRight,同时与0.1
比较,知道什么时候停止。然后在较小的数字上将点向右移动相同的量。
这里有一个简单的建议
BigDecimal a = new BigDecimal("0.0004");
BigDecimal b = new BigDecimal("10000.000003");
final BigInteger aInteger = a.abs().toBigInteger();
final BigDecimal aDecimal = a.subtract(new BigDecimal(aInteger));
final BigInteger bInteger = b.abs().toBigInteger();
final BigDecimal bDecimal = b.subtract(new BigDecimal(bInteger));
final BigDecimal x = aDecimal.compareTo(bDecimal) > 1 ? b : a;
BigDecimal DECIMAL = x.subtract(new BigDecimal(x.abs().toBigInteger()));
int count = 0;
final BigDecimal one = new BigDecimal(1);
while (DECIMAL.multiply(new BigDecimal(10)).compareTo(one) < 0) {
count++;
DECIMAL = DECIMAL.multiply(new BigDecimal(10));
}
a = new BigDecimal(aInteger).add(aDecimal.movePointRight(count));
b = new BigDecimal(bInteger).add(bDecimal.movePointRight(count));
System.out.println("a =" + a + " b = " + b);
你可以做得更好