【问题标题】:Why would a floating point division return an integer result (Java/Android) [duplicate]为什么浮点除法会返回整数结果(Java/Android)[重复]
【发布时间】:2019-12-26 15:31:45
【问题描述】:

我为 Wear OS 重新编译了我的图形应用程序,但有些东西坏了。该应用程序显示一个网格和一个波形,但波形构造错误。在磨损中,网格更粗,这种误差很明显。我已经展示了原始代码和修改后的代码 下面的顺序。

// scale Y coordinate. Input,  elevation in feet.
// Output, y position of elevation in screen coordinate

static float scaleY(double elevation) {
    double a, b, c, offsetFromTopFeet, pixelRange, feetRange, pixelsPerFoot,offsetFromTopPixels;

    // original coding
    a = maxY - elevation;              //point in terms of feet within vert scale.
    b = (bottom - top) / (maxY - minY);
    c = top + (float) (a * b);
    // return (float)c;

    // new coding
    offsetFromTopFeet = maxY - elevation;        // a
    pixelRange = bottom - top;
    feetRange = maxY - minY;
    pixelsPerFoot = pixelRange / feetRange;     // b
    offsetFromTopPixels = top + offsetFromTopFeet * pixelsPerFoot;

    return (float) offsetFromTopPixels;
}

即使变量是双精度数,原始编码中 b 的计算也会返回整数结果。这就是扭曲波形的原因。在变量pixelsPerFoot 下方显示的重构代码中计算正确,并且图形显示正确。我在 android 应用程序中使用了这个例程很多年了,要么我从来没有注意到这个问题,更精细的网格覆盖了它,还是其他什么?

我的问题是为什么 b 计算返回一个整数,但 pixelPerFoot 返回正确的类型?这是编程错误吗?

【问题讨论】:

  • 除非我们知道您使用的每个变量的数据类型,否则这是无法回答的。它可能不是你想象的那样。
  • 您的代码中的一些 cmets:请不要在一行中声明多个变量。相反,在自己的行上声明每个变量。 --- 声明接近第一次使用的变量,在声明中初始化它们。 --- 使用说出变量名:而不是abc...使用描述此变量语义的名称。
  • maxY、minY、bottom 和 top 是整数。
  • @user1644002 以及为什么表达式 (bottom - top) / (maxY - minY) 的计算结果应为 doublefloat 如果所有组件都是 ints?
  • 是的,原始代码来自一个示例,我不理会它。这很难理解。替换代码我用有意义的名称命名变量。但这对编译器来说并不重要。

标签: java android calculation


【解决方案1】:

表达式(bottom - top) / (maxY - minY); 是int 类型,因为两个int 相减是一个int,而一个int 除以一个int 也是一个int。结果分配给的变量类型无关紧要;使用整数运算执行计算,然后在截断后转换为浮点值。

将至少一个变量转换为浮点类型,然后将使用浮点除法计算表达式。

【讨论】:

  • 编译器在进行计算时忽略了目标的类型?
  • @user1644002 编译器不做计算
  • 不想争论,但似乎总是有大量关于类型不匹配的警告,为什么不在这里?
  • @user1644002 因为这不是类型不匹配。 Java 语言规范以这种方式定义语言——它的好坏值得商榷,但这只是我认为的一个事实。是的,表达式的类型基于输入,然后在匹配时转换为输出类型——如果目标类型影响计算,我个人会更加困惑。更糟糕的是,在新的 Java 版本中,我们并没有在所有情况下都指定类型(var 关键字),如果目标类型很重要,这会造成更多的混乱。
  • 感谢您的解释
【解决方案2】:

对于这行代码:

b = (bottom - top) / (maxY - minY);

bottom,top,maxY, andminY`来自哪里?我没有在您发布的代码中看到它们的定义。

如果它们是整数,那么b 当然会以整数值结束(存储在双精度中,但仍然是整数)。赋值的左侧不会改变右侧的数字上下文。如果所有变量都是整数,则右侧是纯整数。

如果你这样做:

b = (double) (bottom - top) / (maxY - minY);

这会给你想要的结果。

【讨论】:

    【解决方案3】:

    所有组件都需要转换,例如 (double) feetRange in denominator

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 2011-04-16
      • 2022-11-29
      • 2021-05-14
      • 2011-07-14
      • 2020-11-26
      相关资源
      最近更新 更多