从.5到正常方式的双向整数

时间:2014-01-12 16:28:27

标签: java int double rounding

我正在进行计算,为此我使用以下表达式:

Player.targetx = (int) (((e.getX() - Frame.x)/(Screen.myWidth/World.worldWidth))-8);

例如:

如果值为(((103 - 40)/(1184/15))-8),则双重答案大约为-7.20186Player.targetx仍然获得-8的价值。

为什么?我想这样做,以便-7.5给我回答-8,而-7,49999 9之类的回答是-7

2 个答案:

答案 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进行更精确的格式化。