我使用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。
为什么结果会有这种差异?
答案 0 :(得分:5)
Math.round()
方法返回int
(或long
。Ole V.V更正了我的错误。很多人认为它会返回float
或double
,这会引起混淆。
在第二次计算中,
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决定使用哪些类型(并使用整数除法作为中间步骤)。这就是精度丢失的原因。