Java BigDecimal:如何仅在其';大于某个精度点?
我有一个用例,只有当数字的精度大于某个数字时,我才想设置比例。 换句话说,如果精度为5,我想将scale设置为4,但如果精度小于4,则保持数字不变 这是我期望的结果->Java BigDecimal:如何仅在其';大于某个精度点?,java,bigdecimal,Java,Bigdecimal,我有一个用例,只有当数字的精度大于某个数字时,我才想设置比例。 换句话说,如果精度为5,我想将scale设置为4,但如果精度小于4,则保持数字不变 这是我期望的结果-> 123.123=>123.123->保留数字原样,因为精度小于4 123.123456=>123.1235->设置刻度,并向上取整 123=>123->保留数字原样,因为精度小于4 0.1234445=>0.1234->比例已设置,并向下舍入 如何使用Java的BigDecimal实现此结果?这些属性有访问方法,您可以直接测试它
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);
}
}
看起来你真正要问的问题是“如何截断BigDecimal的小数部分,使其小数点右侧最多有4个数字?” 首先,我认为您应该确保您了解关于
BigDecimal
的scale
和precision
的含义
如果运行此小程序:
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());
}
}
您现在应该看到,您要做的是查询,然后调整数字的比例
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));
}
}
你试过什么吗?您可以使用ceil
和round
函数。我尝试过使用setScale方法。```if(value!=null){//仅当值有十进制值时设置精度。if(value.ulp().compareTo(new BigDecimal(1))<0){value=value.setScale(precision\u SCALE,RoundingMode.HALF\DOWN);}}`bd.precision()
未给出正确的结果。e、 g.对于123.123
,bd.precision()
产生6
@pratiksanglikar-它给出了正确的结果。您将“精度”定义为与BigDecimal的作者不同的含义。
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