【发布时间】:2015-05-31 23:59:47
【问题描述】:
我正在努力了解 double 的局限性。 0.1 不能在有限系统中表示,因为它是重复的二进制值。但是,当我声明一个变量并给它 0.1 时,它仍然打印为 0.1 和 not .0999999999999999、1.000000000000001 或类似的东西。但是,如果我添加一个 0.1 十倍的变量,它会得到 .9999999999999999,这正是我所期望的。
真正的问题是,当我知道这是不可能的并且我有证据证明这不是真正的价值时,为什么它会精确地以 0.1 打印?
double d = 0.1;
System.out.printf("%.16f\n",d);
System.out.printf("%.16f", d + d + d + d + d + d + d + d + d + d);
我要做的是将字符串文字与双精度转换进行比较,以查看字符串中的值是否可以精确地以双精度表示。例如:
".5" == .5?预期答案:是的。
".1" == .1?预期答案:否。
我正在尝试的比较是
number = new BigDecimal("0.1");
d = number.doubleValue();
if (number.compareTo(new BigDecimal(Double.toString(d))) == 0){
// Doing something
}
任何帮助理解为什么这不能区分可以和不能用双精度表示的值。
【问题讨论】:
-
你确定
BigInteger在这里是正确的吗?还有,为什么不直接支持d到BigDecimal构造函数呢? -
你是对的,它应该是 BigDecimal。我只是想获取相关的代码并犯了那个错误。我在问题中更正了它。