【问题标题】:Java rounding the results of a division when it shouldn't beJava 在不应该的情况下舍入除法的结果
【发布时间】:2013-06-20 12:51:19
【问题描述】:

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

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));
}

现在,如果我在我的计算机上运行它(屏幕分辨率为 1440x900 的 Mac Book pro),结果是“scaleFactorWidth”设置为 2.0,“scaleFactorHeight”设置为 2.0,这是预期的,因为我的屏幕正好是目标大小的一半。但是,如果在具有不同分辨率屏幕的计算机上运行此代码,那么 scaleFactors 似乎会四舍五入,我在 1024x600 的屏幕上进行了测试,并且“scaleFactorWidth”设置为 2.0,“scaleFactorHeight”设置为 3.0 当它应该一直是 2.8125 x 3.0。

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

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

【问题讨论】:

  • 2880 / ui.getWidth();返回一个整数。试试2880.0?我也不确定 ui.getWidth 返回什么。
  • scaleFactorWidthui.getWidth()的类型是什么?如果scaleFactorWidthdoubleui.getWidth()int,则使用2880.0 / ui.getWidth();

标签: java double scaling rounding division


【解决方案1】:

在这些行中

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();

【讨论】:

    【解决方案2】:

    如果你在谈论这个 GameContainer 类,getWidth()getHeight() 返回一个 int。

    所以你必须把它转换成双倍

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

    【讨论】:

    • @johnchen902 不,你错了。 (double)2880 / ui.getWidth(); = ((double)2880) / ui.getWidth();.
    【解决方案3】:

    将其转换为 Double。

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

    【讨论】:

      【解决方案4】:

      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
      

      【讨论】:

        猜你喜欢
        • 2013-10-06
        • 1970-01-01
        • 2015-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        相关资源
        最近更新 更多