简体   繁体   English

BigDecimal(java)中用于指数表示法的缩放问题

[英]Scaling issue in BigDecimal(java) for exponential notation

In our application, we need to check whether the given number is in range or not and for this we are using below code - 在我们的应用程序中,我们需要检查给定的数字是否在范围内,为此,我们使用以下代码-

 boolean isValidRangeNumber(Double no,int precision, int scale){
            BigDecimal bigDecimal = new BigDecimal(no.toString());
            int intPartLength = precision - scale;
            int size = (bigDecimal.longValue() + "").toString().length();

            if(bigDecimal.precision() <= precision && bigDecimal.scale() <= scale && size <= intPartLength)
                return true;

            return false;
        }

But when we are calling isValidRangeNumber(0.0000009, 10,7) than its failing as bigDecimal.scale() is giving 8 which can be max 7 whereas its a valid number. 但是,当我们调用isValidRangeNumber(0.0000009, 10,7) ,它失败了,因为bigDecimal.scale()给出的8可以是最大值7,而其有效数是7。 Please suggest, what is wrong with this BigDecimal usage. 请提出建议,BigDecimal用法有什么问题。

If you inspect following : 如果您检查以下内容:

bigDecimal.toPlainString() // This will show 0.00000090 -> scale of 8, appends trailing 0

Because of an extra trailing zero, following condition evaluates to false. 由于存在额外的尾随零,因此以下条件的计算结果为false。

bigDecimal.scale() <= scale // 8 <= 7

You can change into following : 您可以更改为以下内容:

boolean isValidRangeNumber(Double no, int precision, int scale) {
    BigDecimal bigDecimal = new BigDecimal(no.toString()).stripTrailingZeros(); //Get rid of trailing zeros
    bigDecimal.toPlainString();
    int intPartLength = precision - scale;

    int size = (bigDecimal.longValue() + "").toString().length();

    if (bigDecimal.precision() <= precision && bigDecimal.scale() <= scale
            && size <= intPartLength)
        return true;

    return false;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM