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谢谢您纠正我的错误。