【问题标题】:Loop not working with float?循环不适用于浮点数?
【发布时间】:2014-11-05 02:43:11
【问题描述】:

(libGDX, Java) 我试图让一个对象从屏幕的一侧移动到另一侧,当它到达另一侧时它会重新开始。 我用于操作的代码:

if (position.x < 300) {
position.x -= 1;
}
if (position.x == -70) {
position.x = 131;
}

位置是一个 Vector2。 1 是物体的移动速度和我有问题的地方。如果 position.x -= A Whole NUMBER,则循环可以正常工作,但是如果我希望它为 0.3f、1.5f... 则循环将不起作用,并且对象只会继续移动。 如果修复它,如何使循环适用于任何数字?

【问题讨论】:

  • 我认为你应该看看 [this][1] 线程 [1]:stackoverflow.com/questions/2100490/…
  • if (position.x &lt;= -70) { 浮点数不精确,所以== 很危险。
  • 更好地展示位置是如何定义的。

标签: java android libgdx


【解决方案1】:

之所以如此,是因为浮点数的二进制表示。每个整数(不太大)都有自己的二进制表示形式。但是 0.3 没有它的准确表示。

http://effbot.org/pyfaq/why-are-floating-point-calculations-so-inaccurate.htm

比较浮动时使用:

bool equal(float actual, float expected) {
  return (abs(actual - expected) < 0.000001);
}

【讨论】:

  • @user3395989 如果您想了解更多信息,请转至this site,输入0.3,然后单击float
【解决方案2】:

您可以使用 Float.floatToIntBits()。

Float.floatToIntBits(position.x) == Float.floatToIntBits(-70)

这里是另一个例子:

Float fObj1 = new Float("5.35");
Float fObj2 = new Float("5.34");

int i2 = fObj1.compareTo(fObj2);

if(i2 > 0){
  System.out.println("First is grater");
}else if(i2 < 0){
  System.out.println("Second is grater");
}else{
  System.out.println("Both are equal");
}   

【讨论】:

    猜你喜欢
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 2018-03-23
    • 2012-04-19
    • 1970-01-01
    相关资源
    最近更新 更多