为什么两个计算的结果不同?

时间:2016-09-05 08:26:48

标签: java math

我使用Math.round(...)进行以下两次计算:

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。

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

4 个答案:

答案 0 :(得分:5)

Math.round()方法返回int(或longOle V.V更正了我的错误。很多人认为它会返回floatdouble,这会引起混淆。

在第二次计算中,

Math.round((x * 100) * 10)

返回571。现在,这个值和10都是整数(571长,10是整数)。因此,当计算采用

形式时
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()功能有两个版本。你使用的那个接受一个double(因为x是double)并返回long。在这种情况下,long和int没有区别。

答案 1 :(得分:2)

区别的原因在于,在第二个公式中,您要对两个整数进行除法。为了得到相同的结果,你必须添加一个转换为double:

{{1}}

答案 2 :(得分:1)

区别在于

x = Math.round(571.45732) / 10;

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

由于round(double)返回一个long,在第一种情况下,你将long除以int,得到长57.转换回double导致57.0。第二种情况相当于

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

其中double除以int,得到57.1。

答案 3 :(得分:0)

这是因为Math.round()返回一个int。如果您逐步执行此操作(如第一个示例中所示),则将Math.round()的结果分配给浮点值。以下计算使用浮点除法。

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