Java BigDecimal:只有大于某个精度点时,如何设置比例?
Java BigDecimal: How to set scale only if it's greater than certain precision point?
我有一个用例,我只想在数字的精度大于特定数字时设置比例。
换句话说,如果精度为 5,我想将比例设置为 4,但如果精度小于 4,则保留数字。
这是我期待的预期结果 ->
123.123
=> 123.123
-> 保持数字不变,因为精度小于 4。
123.123456
=> 123.1235
-> 设置比例并向上取整。
123
=> 123
-> 保持数字不变,因为精度小于 4。
0.1234445
=> 0.1234
-> 设置比例并向下舍入。
如何使用 Java 的 BigDecimal 获得此结果?
这些属性有访问方法,你可以直接测试它们:
public static void setScaleIfNeeded(BigDecimal bd, int scale, int minPrecision) {
if (bd.precision() >= minPrecision) {
bd.setScale(scale);
}
}
看来你真正想问的问题是"How do I truncate the decimal portion of a BigDecimal so that it has at most 4 numbers to the right of the decimal point?"
首先,我认为您应该确保您了解 scale
和 precision
对于 BigDecimal
.
的含义
如果你运行这个小程序:
public static void main(String[] args) {
List<BigDecimal> decimals = new LinkedList<>();
decimals.add( new BigDecimal(".123456"));
decimals.add( new BigDecimal("1.23456"));
decimals.add( new BigDecimal("12.3456"));
decimals.add( new BigDecimal("123.456"));
decimals.add( new BigDecimal("1234.56"));
decimals.add( new BigDecimal("12345.6"));
decimals.add( new BigDecimal("123456"));
for(BigDecimal bd : decimals){
System.out.println(bd.toPlainString() + ". scale = " + bd.scale() + ", precision = " + bd.precision());
}
}
您将看到以下输出:
0.123456. scale = 6, precision = 6
1.23456. scale = 5, precision = 6
12.3456. scale = 4, precision = 6
123.456. scale = 3, precision = 6
1234.56. scale = 2, precision = 6
12345.6. scale = 1, precision = 6
123456. scale = 0, precision = 6
您现在应该看到您要做的是查询然后调整号码的scale
。
static BigDecimal doIt(BigDecimal input){
if(input.scale() > 4){
return input.setScale(4, RoundingMode.HALF_DOWN);
}
else{
return input;
}
}
一个小测试程序显示输出是您所要求的:
public static void main(String[] args) {
List<BigDecimal> decimals = new LinkedList<>();
decimals.add(new BigDecimal("123.123"));
decimals.add(new BigDecimal("123.123456"));
decimals.add(new BigDecimal("123"));
decimals.add(new BigDecimal("0.1234445"));
for (BigDecimal bd : decimals) {
System.out.println(bd.toPlainString() + " ---> " + doIt(bd));
}
}
输出
123.123 ---> 123.123
123.123456 ---> 123.1235
123 ---> 123
0.1234445 ---> 0.1234
我有一个用例,我只想在数字的精度大于特定数字时设置比例。 换句话说,如果精度为 5,我想将比例设置为 4,但如果精度小于 4,则保留数字。
这是我期待的预期结果 ->
123.123
=> 123.123
-> 保持数字不变,因为精度小于 4。
123.123456
=> 123.1235
-> 设置比例并向上取整。
123
=> 123
-> 保持数字不变,因为精度小于 4。
0.1234445
=> 0.1234
-> 设置比例并向下舍入。
如何使用 Java 的 BigDecimal 获得此结果?
这些属性有访问方法,你可以直接测试它们:
public static void setScaleIfNeeded(BigDecimal bd, int scale, int minPrecision) {
if (bd.precision() >= minPrecision) {
bd.setScale(scale);
}
}
看来你真正想问的问题是"How do I truncate the decimal portion of a BigDecimal so that it has at most 4 numbers to the right of the decimal point?"
首先,我认为您应该确保您了解 scale
和 precision
对于 BigDecimal
.
如果你运行这个小程序:
public static void main(String[] args) {
List<BigDecimal> decimals = new LinkedList<>();
decimals.add( new BigDecimal(".123456"));
decimals.add( new BigDecimal("1.23456"));
decimals.add( new BigDecimal("12.3456"));
decimals.add( new BigDecimal("123.456"));
decimals.add( new BigDecimal("1234.56"));
decimals.add( new BigDecimal("12345.6"));
decimals.add( new BigDecimal("123456"));
for(BigDecimal bd : decimals){
System.out.println(bd.toPlainString() + ". scale = " + bd.scale() + ", precision = " + bd.precision());
}
}
您将看到以下输出:
0.123456. scale = 6, precision = 6
1.23456. scale = 5, precision = 6
12.3456. scale = 4, precision = 6
123.456. scale = 3, precision = 6
1234.56. scale = 2, precision = 6
12345.6. scale = 1, precision = 6
123456. scale = 0, precision = 6
您现在应该看到您要做的是查询然后调整号码的scale
。
static BigDecimal doIt(BigDecimal input){
if(input.scale() > 4){
return input.setScale(4, RoundingMode.HALF_DOWN);
}
else{
return input;
}
}
一个小测试程序显示输出是您所要求的:
public static void main(String[] args) {
List<BigDecimal> decimals = new LinkedList<>();
decimals.add(new BigDecimal("123.123"));
decimals.add(new BigDecimal("123.123456"));
decimals.add(new BigDecimal("123"));
decimals.add(new BigDecimal("0.1234445"));
for (BigDecimal bd : decimals) {
System.out.println(bd.toPlainString() + " ---> " + doIt(bd));
}
}
输出
123.123 ---> 123.123
123.123456 ---> 123.1235
123 ---> 123
0.1234445 ---> 0.1234