要测试String是否表示double值,您可以执行以下操作:
private static boolean isADouble(String s) {
return new BigDecimal(s).equals(new BigDecimal(Double.parseDouble(s)));
}
public static void main(String[] args) {
System.out.println(isADouble("0.1")); // false
System.out.println(isADouble("0.5")); // true
}
这是有效的,因为新的BigDecimal生成的BigDecimal与String表示的值完全相等,而新的BigDecimal(Double.parseDouble(s))是与该值最接近的两倍的精确值.
我将在最后解释为什么number.compareTo(new BigDecimal(Double.toString(d)))== 0不起作用.
当你这样做
double d = 0.1;
System.out.println(d);
得到答案0.1因为d是与“真实”0.1最接近的两倍. (双d = 0.1;表示“使d最接近的两倍”为0.1.当你写的时候
System.out.println(d + d + d + d + d + d + d + d + d + d);
你看到0.9999999999999999而不是1.你没有看到1的原因是因为有一个双重值比答案更接近于一个(实际上一个是双重值本身).没有理由为什么答案应该是最接近的一对一,因为d首先不是真的0.1(它只是接近它),并且在任何情况下当你添加浮点数时都会引入不准确性.
最后,number.compareTo(new BigDecimal(Double.toString(d)))== 0不起作用,因为即使number.doubleValue()不完全是0.1,Double.toString()仍将其转换为字符串“0.1”因为没有双重值接近“真实”0.1.