如何获得 BigDecimal 的第一个非零数字
How to get first non-zero digit of a BigDecimal
在 java 中如何获取 BigDecimal 的第一个非零数字?
例如:
0.001 => 1
0.02 => 2
987.654 => 9
对于 0 到 1 之间的数字,这将起作用:
bigDecimal.scaleByPowerOfTen(bigDecimal.precision()).setScale(0, RoundingMode.DOWN)
对于大于 1 的数字,这将起作用:
bigDecimal.scaleByPowerOfTen(1-bigDecimal.precision()).setScale(0, RoundingMode.DOWN)
但是有没有适用于任何数字的解决方案?
可以将 BigDecimal
转换为 char[]
并使用循环检查数字。看下面的例子。
BigDecimal bigDecimal = new BigDecimal(5220.33);
char[] chars = String.valueOf(bigDecimal).toCharArray();
for (char c : chars) {
if (Character.isDigit(c) ? Character.getNumericValue(c) != 0 : false) {
System.out.println("First number is : " + c);
return;
}
}
这是一个仅使用 BigDecimal
和 int
的解决方案:
BigDecimal value = new BigDecimal(0.021); //input your value here
int scale = value.scale();
int precision = value.precision();
int result = value.movePointLeft(precision-scale-1).abs().intValue(); //this will generate the result you need
在 java 中如何获取 BigDecimal 的第一个非零数字?
例如:
0.001 => 1
0.02 => 2
987.654 => 9
对于 0 到 1 之间的数字,这将起作用:
bigDecimal.scaleByPowerOfTen(bigDecimal.precision()).setScale(0, RoundingMode.DOWN)
对于大于 1 的数字,这将起作用:
bigDecimal.scaleByPowerOfTen(1-bigDecimal.precision()).setScale(0, RoundingMode.DOWN)
但是有没有适用于任何数字的解决方案?
可以将 BigDecimal
转换为 char[]
并使用循环检查数字。看下面的例子。
BigDecimal bigDecimal = new BigDecimal(5220.33);
char[] chars = String.valueOf(bigDecimal).toCharArray();
for (char c : chars) {
if (Character.isDigit(c) ? Character.getNumericValue(c) != 0 : false) {
System.out.println("First number is : " + c);
return;
}
}
这是一个仅使用 BigDecimal
和 int
的解决方案:
BigDecimal value = new BigDecimal(0.021); //input your value here
int scale = value.scale();
int precision = value.precision();
int result = value.movePointLeft(precision-scale-1).abs().intValue(); //this will generate the result you need