为什么要使用double而不是整数?

时间:2015-05-29 14:11:53

标签: java rounding

首先要做的事情:我来自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

4 个答案:

答案 0 :(得分:3)

如果假设您要为该逗号1.111222

添加小数点

问题是,100会将值转换为long,而100.0会将其转换为doublelong不能有小数,但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)返回intround(double)返回long

答案 3 :(得分:0)

调用Math.round()时,结果为整数值。当你除去两个整数(例如/ 100)时,Java将执行整数除法,抛弃结果的小数部分。

当您将整数除以double(例如/ 100.0)时,Java将首先将整数转换为double值,然后执行浮点除法,保留小数部分。

相关问题