首先要做的事情:我来自php,想用java拓宽视野! 所以我读了一些书。我看到数字四舍五入是机智的Math.round()。
我的问题如下: 如果我想将数字舍入为十进制,我必须使用此代码:
double number;
number = 1.111222;
number = Math.round(number*100.0) / 100.0;
或
number = (digit) Math.round(number*100) / 100;
但是为什么
number = Math.round(number*100) / 100;
没有做同样的事情???
提前,
Marc
答案 0 :(得分:3)
如果假设您要为该逗号1.111222
问题是,100
会将值转换为long
,而100.0
会将其转换为double
。 long
不能有小数,但double
可以。
看看这两种情况:
案例1产生double
:
Math.round(1.111222*100.0) => Math.round(111.222) => 111
111/100.0 => 1.11
案例2产生 int
long
:
(我原谅地认为int
但被输出证明是错误的,原因是Math.round(double)
返回long
找到here)
Math.round(1.111222*100) => Math.round(111) => 111
111/100 => 1 //truncated due to being a long
您可以通过运行以下代码来查看:
public static void main (String[] args)
{
double number = 1.111222;
System.out.println(Math.round(number*100.0)/100.0);
System.out.println(Math.round(number*100)/100);
Object a = Math.round(number*100.0)/100.0;
Object b = Math.round(number*100)/100;
System.out.println(a.getClass().getName());
System.out.println(b.getClass().getName());
}
打印哪些:
1.11
1
java.lang.Double
java.lang.Long
答案 1 :(得分:1)
因为Math.round
返回long
。
因此,舍入(类型long
)的结果除以int
。在划分之前,JVM将两者都转换为long
。
请参阅此处了解Java widening conversion rules。
答案 2 :(得分:1)
在javadoc中很清楚。
Returns the closest {@code int} to the argument, with ties rounding up.
因此round(float)
返回int
,round(double)
返回long
。
答案 3 :(得分:0)
调用Math.round()时,结果为整数值。当你除去两个整数(例如/ 100)时,Java将执行整数除法,抛弃结果的小数部分。
当您将整数除以double(例如/ 100.0)时,Java将首先将整数转换为double值,然后执行浮点除法,保留小数部分。