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