所以我将我的应用程序中的一个错误缩小到java乱搞一个简单的减法计算。我无法弄明白为什么。这是一些代码:
for (double x = (((double)bdl.length())-1)/10; x > 0; x--) {
int count;
System.out.println("x = " + x);
if (x >= 1) {
System.out.println("X = " + x + " so count = 20");
count = (20);
} else {
count = (int)(x*20);
System.out.println("X = " + x + " so count = "+count);
}
}
变量bdl只是一个JSONArray,我只关注它的长度。当bdl最初进入时它的长度为15,因此x将等于1.4。第一次通过循环时,第一个println说“X = 1.4 so count = 20”,这是正确的。第二次通过,当x应该= 0.4时,它反而说“X = 0.3999999999999999 so count = 7”。我明白在那个点和时间将(x * 20)转换为int会给我7,但我的问题是为什么x不等于0.4。
答案 0 :(得分:1)
您使用的是double
,这是一个浮点数。这不是为了预先设定,而是为了速度和非精确。相反,您应该使用int
,如下所示:
for (int x = ((bdl.length())-1)/10; x > 0; x--) {
这将使您的数字保持准确。
答案 1 :(得分:0)
实际上,你的'x'确实等于0.4,这只是一个精确的问题。
应该以一定的精度执行所有浮点比较操作(在某些实现中为delta或epsilon)。
请参阅this post。