我正在解析一个字符串值,我知道它包含一个数字。
如果它只包含数字,并且介于Integer.MIN_VALUE和Integer.MAX_VALUE之间,我将其解析为int,类似地,如果不是,我将使用BigInteger。
如果它包含一个十进制值,我想将其解析为double或BigDecimal。
我可以测试字符串中的数值是否"适合"双精度,因此可以安全地解析为双精度,或者是否需要将其保存在BigDecimal中以防止精度损失?
,因此可以安全地解析为双精度,或者它是否需要保存在BigDecimal中以防止精度损失?
这不是您想要的答案,但由于您似乎担心精度损失,因此应该使用BigDecimal
来代替任何double
。
数字0.1
可以适合在double
中,但它并不精确(因为0.1
不能用二进制精确表示(。
请参阅:浮点数学坏了吗?
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
}
我会将其解析为BigDecimal,然后检查double是否可以在不丢失信息的情况下将值存储到可接受的程度。