Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免条件句中双值的舍入错误?_Java_Double_Rounding - Fatal编程技术网

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,我只是觉得可能有一种很好的方法可以解决它,因为当时我只是以这种方式编码它,并想稍后再回来。我在这里。:)但是谢谢,我将提取常量并坚持“足够接近”的方法。