繁体   English   中英

为什么使用双精度代替整数?

[英]Why use double instead of integer?

首先,第一件事:我来自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;

没有做完全相同的事情???

提前谢谢

如果假设您要为该逗号1.111222小数点1.111222

问题是100会将值100.0转换为long值,而100.0会将值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

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

因为Math.round返回long 因此,舍入( long类型)的结果除以一个int 在除法之前,JVM将两者都转换为long 有关Java 扩展转换规则,请参见此处。

在javadoc中很明显。

 Returns the closest {@code int} to the argument, with ties rounding up.

因此round(float)返回intround(double)返回long

当您调用Math.round()时,结果是一个整数值。 当您将两个整数相除(例如/ 100)时,Java将执行整数除法,丢弃结果的小数部分。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM