我正在进行计算,为此我使用以下表达式:
Player.targetx = (int) (((e.getX() - Frame.x)/(Screen.myWidth/World.worldWidth))-8);
例如:
如果值为(((103 - 40)/(1184/15))-8)
,则双重答案大约为-7.20186
。 Player.targetx
仍然获得-8
的价值。
为什么?我想这样做,以便-7.5
给我回答-8
,而-7,49999
9之类的回答是-7
。
答案 0 :(得分:4)
转换为int
始终截断朝向0.要围绕,您可以使用Math.round()
代替。但是,这总是将向上的一半:
class Test {
public static void main(String[] args) {
System.out.println(Math.round(-7.7)); // -8
System.out.println(Math.round(-7.5)); // -7
System.out.println(Math.round(-7.2)); // -7
System.out.println(Math.round(+7.2)); // 7
System.out.println(Math.round(+7.5)); // 8
System.out.println(Math.round(+7.7)); // 8
}
}
你确定你想要将的一半分开吗?如果是这样,Math.round()
将不会完全按照您的意愿行事。你可以编写自己的方法:
public static long customRound(double x) {
return x >= 0 ? (long) (x + 0.5)
: (long) (x - 0.5);
}
这将始终从零开始,通过先加上或减去0.5(取决于符号)然后截断为0.这将生成与之前相同的值,除了-7.5舍入为-8。
编辑:我怀疑剩下的问题几乎可以肯定是由于整数运算中的除法。我们不知道您的任何值的类型,但我怀疑它们都是int
,这会导致这个问题。如果您创建除法double
的任一操作数,它将在double
算术中执行除法。最简单的方法 - 也可以提高可读性 - 可能是提取一些表达式来分离变量,并在必要时进行转换:
double xDifference = e.getX() - Frame.x;
double widthRatio = Screen.myWidth / (double) World.worldWith;
double x = (xDifference / widthRatio) - 8;
Player.targetx = (int) Math.round(x);
如果仍然不起作用,至少你会更容易看到错误。
答案 1 :(得分:0)
最终转换为int会导致结果舍入。尝试将该演员变为双倍。或者可以考虑使用DecimalFormat进行更精确的格式化。