簡體   English   中英

double類的parseDouble增加了額外的零

[英]parseDouble of Double class adds extra zero

public static double centsToDollars(Number cents, int precision) {
    return BigDecimal.valueOf(cents.doubleValue() / 100).setScale(precision, RoundingMode.DOWN).doubleValue();
}

當我想以美元顯示分值時,上面的代碼完全正常。 例如,1美分,它返回0.01美元。

assertEquals("$0.01", FormatUtils.centsToDollars(1, 3)) 
assertEquals("$0.012", FormatUtils.centsToDollars(1.2345, 3))
assertEquals("$0.327", FormatUtils.centsToDollars(32.7, 3))

但我無法弄清楚,為什么FormatUtils.centsToDollars(0.65, 3)返回$ 0.0060。 我希望收到0.006。 什么是最新的零?

更新

看起來問題的根本原因是調用BigDecimaldoubleValue()

System.out.println(Double.parseDouble("0.006")); 

System.out.println(BigDecimal.valueOf(0.006).doubleValue());

給我返回0.0060

任何線索為什么會這樣?

double類的parseDouble增加了額外的零

Java 1.4到6中有一個錯誤ID:4428022 ,這意味着它增加了一個你不需要的額外零。 僅在值0.001到0.009時發生這種情況。 Java 7沒有這個bug。

for (int i = 1; i <= 9; i++)
    System.out.println(i / 1000.0);

在Java 6打印

0.0010 0.0020 0.0030 0.0040 0.0050 0.0060 0.0070 0.0080 0.0090

但在Java 7打印

0.001 0.002 0.003 0.004 0.005 0.006 0.007 0.008 0.009


我懷疑實際上0.65實際上略少。 當你將它除以100時,得到類似於0.006499999999999的東西,當圓形下降到0.006時

我懷疑你想要的是什么

public static String centsToDollars(Number cents, int precision) {
    return "$" + BigDecimal.valueOf(cents.doubleValue())
           .divide(BigDecimal.valueOf(100))
           .setScale(precision, RoundingMode.HALF_UP);
}

嘗試

System.out.println(new BigDecimal(0.65 / 100));

這就是我寫它的方式

public static String centsToDollars(double cents) {
    double rounded = Math.round(cents * 100) / 1e4;
    return "$" + rounded;
}

假設兩位小數。

double類的parseDouble增加了額外的零

不,不。 您用來格式化 double的方法就是這樣做。 雙打不包含尾隨小數零。 它們不包含小數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM