Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.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_Math - Fatal编程技术网

Java 为什么这两种计算的结果不同?

Java 为什么这两种计算的结果不同?,java,math,Java,Math,我用数学做了以下两个计算。圆…: double x = 0.57145732; x = x * 100; x = Math.round(x * 10); x = x / 10; 如果我现在打印x的值,它将显示:57.1 double x = 0.57145732; x = (Math.round((x * 100) * 10)) / 10; // x = (Math.round(x * 1000)) / 10; //Also gives me 57.0. 如果我现在打印x的值,它将显示:57

我用数学做了以下两个计算。圆…:

double x = 0.57145732;
x = x * 100;
x = Math.round(x * 10);
x = x / 10;
如果我现在打印x的值,它将显示:57.1

double x = 0.57145732;
x = (Math.round((x * 100) * 10)) / 10;
// x = (Math.round(x * 1000)) / 10; //Also gives me 57.0.
如果我现在打印x的值,它将显示:57.0


为什么结果会有这种差异?

这是因为Math.round返回一个int。如果像第一个示例中那样一步一步地执行此操作,则会将Math.round的结果指定给一个浮点值。下面的计算使用浮点除法


在第二个示例中,让JVM决定使用哪种类型,并使用整数除法作为中间步骤。这就是精度丢失的原因。

这是因为Math.round返回一个int。如果像第一个示例中那样循序渐进地执行此操作,则将Math.round的结果指定给浮点值。下面的计算使用浮点除法

在第二个示例中,让JVM决定使用哪种类型,并使用整数除法作为中间步骤。这就是精度丢失的原因。

Math.round方法返回long类型的整数,正如所指出的。它通常被认为是返回一个float或double,这会引起这些混淆

在第二次计算中

Math.round((x * 100) * 10)
返回571。现在,这个值和10都是整数571是长的,10是int。所以当计算采用

x = 571 / 10
如果x是double,571/10返回57,而不是57.1,因为它是int。然后,57转换为double,变成57.0

如果你这样做

x = (double)Math.round((x * 100) * 10) / 10.0;
其值变为57.1

编辑:Math.round函数有两个版本。因为x是double并且返回long,所以您使用的那个接受double。在您的例子中,隐式类型转换省去了考虑精确的小细节的麻烦。

Math.round方法返回一个long类型的整数,正如所指出的。它通常被认为是返回一个float或double,这会引起这些混淆

在第二次计算中

Math.round((x * 100) * 10)
返回571。现在,这个值和10都是整数571是长的,10是int。所以当计算采用

x = 571 / 10
如果x是double,571/10返回57,而不是57.1,因为它是int。然后,57转换为double,变成57.0

如果你这样做

x = (double)Math.round((x * 100) * 10) / 10.0;
其值变为57.1


编辑:Math.round函数有两个版本。因为x是double并且返回long,所以您使用的那个接受double。在您的例子中,隐式类型转换省去了考虑精确的小细节的麻烦。

产生差异的原因是,在第二个公式中,您正在对两个整数进行除法。为了获得相同的结果,您必须向double添加强制转换:

double x = 0.57145732;
x = (double)(Math.round((x * 100) * 10)) / 10;

产生差异的原因是,在第二个公式中,你要对两个整数进行除法。为了获得相同的结果,您必须向double添加强制转换:

double x = 0.57145732;
x = (double)(Math.round((x * 100) * 10)) / 10;

区别在于

x = Math.round(571.45732) / 10;

由于rounddouble返回一个long,在第一种情况下,将long除以int,得到long 57。将双引线转换回57.0。第二种情况相当于

x = ((double)Math.round(571.45732)) / 10;

其中,双精度除以整数,结果为57.1。

差值为

x = Math.round(571.45732) / 10;

由于rounddouble返回一个long,在第一种情况下,将long除以int,得到long 57。将双引线转换回57.0。第二种情况相当于

x = ((double)Math.round(571.45732)) / 10;

其中double除以int,结果为57.1。

Math.round返回int或long。这对计算有轻微影响。浮点数很奇怪。因为,浮点数,舍入,以及诸如此类的事情…表面下比人们通常认为的更复杂?!尤其是当你在使用Math.round时混合double和float的时候。@Bob我刚刚算出来了,哈哈。谢谢,编辑评论。我真傻,对不起。复制错误。浮点数应该是双倍的。就像原始代码一样。将在我的示例中更改它。尝试除以10.0,而不是10,以获得double而不是integer作为outcomeMath.round返回int或long。这对计算有轻微影响。浮点数很奇怪。因为,浮点数,舍入,以及诸如此类的事情…表面下比人们通常认为的更复杂?!尤其是当你在使用Math.round时混合double和float的时候。@Bob我刚刚算出来了,哈哈。谢谢,编辑评论。我真傻,对不起。复制错误。浮点数应该是双倍的。就像原始代码一样。在我的示例中,我们将对其进行更改。尝试除以10.0,而不是10,以便得到double而不是integer作为结果。为了精度起见,接受double的重载版本Math.round返回一个long。它仍然有值571,所以参数一直保持不变。@OleVV感谢您纠正我的错误。为了精确起见,重载版本的Math.round接受一个double,这里使用的double返回一个long。它仍然存在
值为571,因此该参数始终有效。@Olev谢谢您纠正我的错误。