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

标签 java bigdecimal

在我们的应用程序中,我们需要检查给定的数字是否在范围内 为此,我们使用以下代码 -

 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;
        }

但是当我们调用 isValidRangeNumber(0.0000009, 10,7) 时,它会失败,因为 bigDecimal.scale() 给出的是 8,最大可能是 7,而它的有效号码。请提出这个 BigDecimal 用法有什么问题。

最佳答案

如果您检查以下内容:

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

由于额外的尾随零,以下条件的计算结果为 false。

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

您可以更改为以下内容:

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;
}

关于java - BigDecimal(java) 中指数表示法的缩放问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40215448/

相关文章:

java - 在 fragment 中使用 android-color-picker?

java - 从 JAVA 运行 bash 脚本并返回结果

java - 关闭后重新启动log4j2

java - 在没有科学记数法的情况下格式化字符串中的 double

java - java - 如何在java中将带有美元符号的字符串数值转换为BigDecimal?

java - 如何在不遇到 SecurityException 的情况下从 Scala 脚本引用 java.sql?

java - 我们如何根据 url 将数据写入文件?

java - 在没有指数格式的情况下将 bigdecimal 转换为 double

java - 如何在 Java 中识别 BigDecimal 和 Double

java - 为什么某些 double 在打印到控制台时会自动舍入?