当方法需要int参数时使用float?

时间:2014-06-04 15:33:24

标签: java

我正在用java编写游戏,小行星飞过屏幕撞向宇宙飞船。小行星的速度是浮点数,但每个小行星的X和Y值是整数。结果,每当速度达到新的整数值时,小行星的运动就会跳跃。 我不能对X和Y值使用float或double值,因为我需要碰撞的矩形类需要int作为参数。

我尝试使用双打功能,所以我可以使用天花板功能,

    public static int doubleToInt(double d){
    int i = Math.ceil(d);       
}

但这也导致了转换为整数的问题。有更好的方法吗?

编辑:小行星类的适用代码:

import java.awt.*;
import java.util.Random;

public class Asteroid {
// the main enemy class of the game, an asteroid!
// these are generated through a for loop in the main game loop.
int x ;
int y ;
int r = 4; // radius of each asteroid. 
static float speed = 1;; // speed of asteroids, increases as time goes by.

void move(Asteroid rock){
    if(hasReachedBottom(rock)){
        //rock.x = randInt(520,550); // random to start, so that the asteroids may be offset a bit.
        //rock.y = randInt(0,Game.theGame.getHeight()); // y position, constant for each asteroid. Casted as an int. random number
        initAsteroids(rock,rock.r + 500,501 + rock.r );// this range is for after the asteroids spawn.
        //rock.x = 100;
    }
    x -= speed;
}

private boolean hasReachedBottom(Asteroid rock){
    if(rock.x + rock.r < 0){
        return true;
    } else {
        return false;
        }

}
void paint(Graphics2D g){ // render an asteroid
    g.setColor(Color.RED);
    g.fillOval(x, y, r, r);
}

public Rectangle getBounds(Asteroid rock){
    return new Rectangle(rock.x,rock.y,rock.r,rock.r);

}

}

5 个答案:

答案 0 :(得分:1)

是的,只需:

int i = ((int)d); // cast to int - same like applying Math.floor()
i += (d-i > 0 ? 1 : 0); // in case the fraction part of the integer is bigger than zero, add 1 (ciel)

这实际上是在实现Math.ciel()

的相同行为

答案 1 :(得分:1)

如果你想将一个双精度转换成一个int,你可以:

int i = (int)d;

如果你看看这个,你可以看到在从0到2的双数字的情况下会发生什么:

    for(double d = 0; d < 2; d+=0.1) {
        System.out.print((int)d);
    }

这是印刷品:

0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1

在你的情况下,双倍(速度)会增加并且每次达到新的整数时都会影响宇宙飞船。如果您的坐标系是离散的,则必须如此。

答案 2 :(得分:0)

double分配给intnarrowing conversion,因此语言不允许隐式转换(代码中包含的内容)。如果你用演员表明你的意图,代码将编译:

int i = (int) Math.ceil(d);

我必须说你的舍入方法有点不寻常,但如果它是你需要的,那就这样吧。一些替代方案是使用Math.round(d)并对其进行投射,或通过将d投射到int来向下舍入。

答案 3 :(得分:0)

您可以轻松地混合浮点数和整数数学(几乎所有语言),只有编译器要求它在您需要可能溢出的类型转换时明确说明。

一个简单的设计是简单地使用float(或double)作为坐标,并在创建矩形时转换为int:

int i = (int) floatValue;

你选择的转换方法真的无关紧要,交替的是Math.round(),floor()或ceil() - ,只要你一直使用它(避免比较)苹果到橘子)。

由于该位置已经封装在您的小行星类中,并且移动方法也位于小行星类上,因此不需要进行太多更改。

答案 4 :(得分:0)

Math.ceil(double)的返回类型仅为double。所以最好使用Double的double包装器类,它具有获取double的int值并从intValue()返回int值的函数,intValue方法在内部对int进行类型转换,已经java正在做的事情为什么要写一些额外的代码 -
你可以这样做。

Double k= Math.ceil(d);
int i=k.intValue();