更新:谢谢凯文,我的意思是标题中的<=,而不是<。
这个对吗?这是我在这个问题上经历了一段令人尴尬的时间后所取得的最好成绩:
public int candidate_answer(double f, float g) {
int test = (int)Math.floor(f / g);
if ((test + 1) * g <= f) {
test++;
}
return test;
}
背景:
该应用程序是一个简单的游戏,我从以前的程序员那里接管了它的所有权。奇怪的是,他选择在成员变量和参数变量中任意混合浮点数和双精度数,因此上下有很多不必要的隐式和显式转换。
玩家坐标在双 x, y 处(假设玩家是一个点)。有一个浮动 TILE_SIZE,世界是一些行和列的瓦片,加上一些通用的越界处理。假设 (x,y) 坐标在界限内,我试图根据 x(获取列)或 y(获取行)来确定用户在哪个图块中。这就像程序员 101。
WLOG,起初我只是在做col = (int)(x/TILE_SIZE)
. 但正如我发现的那样,例如 .5/.1f < 5,因此(int)(.5/.1f) == 4
是错误的答案。这导致了上述if语句和问题的表述。
然后我发现,例如,(int)(-9.999999747378752E-5 / .1f) == 0
这导致我先打电话Math.floor
。
但现在我不确定这种方法中还有哪些其他错误,或者最好的方法是什么。
(如果用户正处于某一排或另一排的风口浪尖,而我们不小心四舍五入到错误的那一排,这似乎没什么大不了的;但真正的问题是在代码中,我们看到意外的符号变化(+, -, 0)。例如,一些代码假设如果用户在 (r,c) 处的图块上,那么它的点实际上包含在该图块几何体中。如果不是,我们会得到类似当只预期非负数时的负距离等等,它会导致断言触发和 while 循环中断等等。)