簡體   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