对变量类型和Math.round感到困惑

问题描述 投票:0回答:1
double n = 123.4567, o = 123.4567, p = 123.4567;
    n *= 100;
    n = Math.round(n);
    n = n / 100;

    System.out.println(n);

    System.out.println(Math.round(o * 100) / 100);

    System.out.println(((double) Math.round(p * 100)) / 100);

正在研究将小数四舍五入到 2 点的简单方法,发现了这个。 输出:

123.46
123
123.46

第一种方法和第二种方法之间有我没有看到的区别吗?它们应该是相同的算法,只是压缩成一行。为什么当所有内容都在一行中时需要强制转换,而在单独的行中则不需要强制转换?

java math rounding
1个回答
0
投票

第一种方法:

n *= 100;        // Multiply by 100
n = Math.round(n); // Round to the nearest whole number
n = n / 100;      // Divide by 100

这里,由于浮点运算的性质,乘法和舍入运算引入了一些不精确性。将 123.4567 舍入乘以 100 后,得到 12346.0。除以 100 后,得到 123.46。

第二种方法:

System.out.println(Math.round(o * 100) / 100);

在这里,您对 123.4567 * 100 进行舍入,结果为 12346。然后除以 100,得到 123.0。

主要区别在于,在第一种方法中,您在乘法之后执行舍入,然后执行除法,而在第二种方法中,您对乘法结果进行舍入并立即除法。

如果您希望第二种方法产生与第一种方法类似的结果,则应在除法之前将舍入运算的结果转换为双倍:

System.out.println((double) Math.round(o * 100) / 100);

这确保除法以浮点精度完成,您将得到 123.46 作为结果。

© www.soinside.com 2019 - 2024. All rights reserved.