【问题标题】:How can I tell if a decimal number represented as a String will fit in a double?如何判断以字符串表示的十进制数是否适合双精度数?
【发布时间】:2019-04-11 03:53:33
【问题描述】:

我正在解析一个我知道包含数字的字符串值。

如果它只包含数字并且它在 Integer.MIN_VALUE 和 Integer.MAX_VALUE 之间,我会将其解析为 int,类似地处理 long,否则我将使用 BigInteger。

如果它包含十进制值,我想将其解析为双精度或 BigDecimal。

我可以测试字符串中的数值是否“适合”双精度数,因此可以安全地解析为双精度数,或者是否需要将其保存在 BigDecimal 中以防止精度损失?

【问题讨论】:

  • new Integer(String) 会起作用吗?如果它抛出异常,您可以尝试其他选项
  • 一般来说,如果你只坚持一种数字类型,你的生活几乎肯定会简单得多。如果您有一个可以表示任意十进制数的字符串,请使用BigDecimal 而不是尝试在intBigIntegerlongdoubleBigDecimal 之间切换。尝试切换类型会增加复杂性,而这几乎不会真正带来有意义的好处。

标签: java types casting double bigdecimal


【解决方案1】:

我会将其解析为 BigDecimal,然后检查 double 是否可以在不丢失信息的情况下将值存储到可接受的程度。

【讨论】:

    【解决方案2】:

    Double 类包含以下常量:

    public static final double MIN_VALUE = 0x0.0000000000001P-1022; // 4.9e-324
    public static final double MAX_VALUE = 0x1.fffffffffffffP+1023; // 1.7976931348623157e+308
    

    如果可以,您可以使用它们来执行检查。
    但是仅仅一个try/catch 块不是更容易吗:

    String str = "1234567890";
    double number = 0;
    try {
        number = Double.parseDouble(str);
    } catch (NumberFormatException e) {
        e.printStackTrace();
        // put extra code here
    }
    

    【讨论】:

      【解决方案3】:

      因此可以安全地解析为双精度数,或者是否需要将其保存在 BigDecimal 中以防止精度损失?

      这不是您要寻找的答案,但由于您似乎担心精度损失,您应该使用BigDecimal 代替任何double

      数字0.1 可以适合double 中,但它并不精确(因为0.1 不能用二进制精确表示)。

      见:Is floating point math broken?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-25
        • 2019-08-13
        • 1970-01-01
        • 1970-01-01
        • 2015-05-30
        • 1970-01-01
        相关资源
        最近更新 更多