Java 如何避免条件句中双值的舍入错误?
目前,我的代码是这样的:Java 如何避免条件句中双值的舍入错误?,java,double,rounding,Java,Double,Rounding,目前,我的代码是这样的: if (!flipped){ scaleX -= 0.1; if (scaleX < 0.0001){ sounds.playSound("flick"); flipped = true; } } 我怎样才能做到这一点?因为双精度值(scaleX)实际上从来都不是0。要定义某种公差,请执行以下操作: if (Math.abs(scaleX) < tolerance) if(Math.abs(scaleX)
if (!flipped){
scaleX -= 0.1;
if (scaleX < 0.0001){
sounds.playSound("flick");
flipped = true;
}
}
我怎样才能做到这一点?因为双精度值(scaleX)实际上从来都不是0。要定义某种公差,请执行以下操作:
if (Math.abs(scaleX) < tolerance)
if(Math.abs(scaleX)<公差)
您不应该检查值是否正好为零——只要“足够接近零”。这只是二进制浮点类型的一种生活方式。。。像“0.1”和“0.0001”这样的东西不能用二进制浮点来精确表示,这就是为什么会遇到这种情况
不清楚您为什么不喜欢原始代码,以及为什么希望它成为第二种形式。除了不取绝对值之外,第一个代码在我看来还行。(我会提取常数,但这是另一个问题。)要定义某种公差,请执行以下操作:
if (Math.abs(scaleX) < tolerance)
if(Math.abs(scaleX)<公差)
您不应该检查值是否正好为零——只要“足够接近零”。这只是二进制浮点类型的一种生活方式。。。像“0.1”和“0.0001”这样的东西不能用二进制浮点来精确表示,这就是为什么会遇到这种情况
不清楚您为什么不喜欢原始代码,以及为什么希望它成为第二种形式。除了不取绝对值之外,第一个代码在我看来还行。(我会提取出常数,但那是另一回事。)你不能,因为浮点数学不能产生精确的结果,因为只有2^64个双精度值来表示有限的数字。你不能,因为浮点运算无法产生精确的结果,因为只有2^64个双精度值来表示有限的数字。当使用浮点运算时,通常在概念上写“非常接近”而不是“相等”
if ( x - y < verySmallValue )
你的y是0,所以你在写
if ( x < verySmallValue)
if(x
我认为这在概念上是好的 使用浮点运算时,通常在概念上写“非常接近”而不是“相等”
if ( x - y < verySmallValue )
你的y是0,所以你在写
if ( x < verySmallValue)
if(x
我认为这在概念上是好的 根据变量的使用情况,您可能需要使用类。根据变量的使用情况,您可能需要使用类。谢谢Jon,我只是觉得可能有一种很好的方法可以解决这个问题,因为当时我只是以这种方式编码,并想稍后再讨论。我在这里。:)但是谢谢,我将提取常数并坚持使用“足够接近”的方法。谢谢Jon,我只是觉得可能有一种很好的方法可以解决它,因为当时我只是以这种方式编码它,并想稍后再回来。我在这里。:)但是谢谢,我将提取常量并坚持“足够接近”的方法。