Java在不应该的情况下舍入分割的结果

时间:2013-06-20 12:51:19

标签: java double scaling rounding division

所以我有一些代码可以通过将“理想”屏幕的大小除以用户屏幕的大小来将图形缩放到用户屏幕的大小。她是我正在做的代码片段:

public void setScaleFactor(GameContainer ui) {
    scaleFactorWidth = 2880 / ui.getWidth();
    scaleFactorHeight = 1800 / ui.getHeight();

    System.out.println("Screen measured as: "
            + Integer.toString(ui.getWidth()) + "x"
            + Integer.toString(ui.getHeight()));

    System.out.println("Scale factors are: "
            + Double.toString(scaleFactorWidth) + " "
            + Double.toString(scaleFactorHeight));

    textScale = (scaleFactorWidth + scaleFactorHeight) / 2;

    System.out.println("Text scale is: " + Double.toString(textScale));
}

现在,如果我在我的电脑上运行(Mac Book pro,屏幕分辨率为1440x900),那么“scaleFactorWidth”设置为2.0,“scaleFactorHeight”设置为2.0,这是我的屏幕预期的正好是目标尺寸的一半。但是如果在具有不同分辨率屏幕的计算机上运行此代码,则scaleFactors似乎被四舍五入,我在1024x600的屏幕上运行测试,并且“scaleFactorWidth”设置为2.0“scaleFactorHeight”设置为3.0时应该已经2.8125 x 3.0。

这是java中的某种舍入错误,如果是这样,我该如何解决?

编辑:感谢所有的帮助,我意识到我非常愚蠢,因为我需要做的就是添加.0到2880和1800.

4 个答案:

答案 0 :(得分:4)

在这些行中

scaleFactorWidth = 2880 / ui.getWidth();
scaleFactorHeight = 1800 / ui.getHeight();

计算本身是基于整数的(根据后来的Integer.toString()调用)。然后将结果转换为double

请改用此代码,以使实际计算使用double值:

scaleFactorWidth = 2880.0 / ui.getWidth();
scaleFactorHeight = 1800.0 / ui.getHeight();

scaleFactorWidth = 2880.0 / (double)ui.getWidth();
scaleFactorHeight = 1800.0 / (double)ui.getHeight();

答案 1 :(得分:1)

如果您正在讨论此GameContainer课程,getWidth()getHeight()会返回一个int。

所以你必须把它作为双重

scaleFactorWidth = (double)2880 / ui.getWidth();
scaleFactorHeight = (double)1800 / ui.getHeight();

答案 2 :(得分:1)

将它投射到Double。

   scaleFactorWidth = (Double)2880 / ui.getWidth();
    scaleFactorHeight = (Double)1800 / ui.getHeight();

答案 3 :(得分:0)

ui.getWidth和ui.getHeight()返回int,当你对int执行操作时,它会再次返回int。所以将你的int值转换为Double。

Double    scaleFactorWidth = new Double(2880) / new Double(ui.getWidth());
Double    scaleFactorHeight = new Double(1800) / new Double(ui.getHeight());

检查以下样本,

public static void main(String[] args) {
            Double scaleFactorWidth =  new Double(2880) /  new Double(1024);
            Double scaleFactorHeight = new Double(1024) / new Double(600);


            System.out.println("Scale factors are: "
                    + Double.toString(scaleFactorWidth) + " "
                    + Double.toString(scaleFactorHeight));

            Double textScale = (scaleFactorWidth + scaleFactorHeight) / 2;

            System.out.println("Text scale is: " + Double.toString(textScale));
        }

输出:

Scale factors are: 2.8125 1.7066666666666668
Text scale is: 2.2595833333333335