目前这是我的代码:
if (!flipped){
scaleX -= 0.1;
if (scaleX < 0.0001){
sounds.playSound("flick");
flipped = true;
}
}
以下是我希望它的样子:
if (!flipped){
scaleX -= 0.1;
if (scaleX == 0){
sounds.playSound("flick");
flipped = true;
}
}
我怎样才能做到这一点?因为double值(scaleX)实际上从不为0。
答案 0 :(得分:2)
您想要定义某种容差,然后执行:
if (Math.abs(scaleX) < tolerance)
您不应该检查正好零的值 - 只是“足够接近零”。这只是二进制浮点类型的一种生活方式......像“0.1”和“0.0001”这样的东西在二进制浮点中并不完全可以表示,这就是你遇到这种情况的原因。
为什么你不喜欢原始代码,为什么你希望它成为第二种形式。除了没有取绝对值,第一个代码看起来没问题。 (我将提取常量,但这是一个单独的问题。)
答案 1 :(得分:1)
你不能,因为浮点数学不能产生精确的结果,因为只有2 ^ 64个双值来表示数字的无穷大。
答案 2 :(得分:1)
使用浮点运算时,通常在概念上写一个“非常接近”而不是等于。
if ( x - y < verySmallValue )
而不是
if ( x == y )
你的y是0,所以你正在写
if ( x < verySmallValue)
我觉得这个概念很好。
答案 3 :(得分:0)
根据变量的用法,您可能希望使用BigDecimal类。