2015-05-11 17 views
1

我正在處理一個項目,該項目要求我在正好兩位小數的位置有兩個值。使用一些數學,我目前有大多數數字正確圓整,除非有尾隨零。我想保留這些0的結果,如0.00特別是此列表顯示在TableView中,因此必須按數字排序。我希望double值實際上是雙打的,以便它可以正確排序。Fomat Double到2小數位不使用字符串

有什麼辦法可以保留2位小數沒有String.format?

預先感謝您。

+1

重複:http://stackoverflow.com/questions/5945867/how-to-round-the -double-value-to-2-decimal-points – JohannisK

+1

僅供參考,當googleing round double 2小數位時首次觸發java – JohannisK

+0

爲什麼double而不是BigDecimal? –

回答

1

可以使用的DecimalFormat

DecimalFormat df = new DecimalFormat("#.00"); 

00 = 恰好兩位小數。

但是這會給你一個String,你可以再次轉換爲double,如果你不希望有這種String-conversioncheck this question,看看它如何使用BigDecimal實現。

恕我直言,如果這不是學習pourposes DecimalFormat將足夠你。的確,你將在轉換的某一時刻使用String,但你只會讀取和存儲double,你的排序將是正確的......

+0

我主要關心的是這些double值在TableView中顯示。表格本身可以通過選擇一個列進行排序 - 工作正常。表單元格顯示存儲爲SimpleDoubleProperty的double值。四捨五入到小數點後兩位是正常工作,除非有尾隨零,所以我試圖找到解決辦法。防爆。 2.50而不是2.5 – user3806226

+0

所以'double-String-double'就是你需要的 –

0

您可以使用DecimalFormat,在DecimalFormat只需設置格式的要求您2DP這樣的構造:

double d = 1.234567; 
DecimalFormat df = new DecimalFormat("#.##"); 
System.out.print(df.format(d)); 

輸出:

1.23 

這個代碼將全面小數高達到Decima的l地方然而,它的結果將不會達到2小數,如果它自己的價值不是最小2位小數。例如

double d = 1.2; 
    DecimalFormat df = new DecimalFormat("#.##"); 
    System.out.print(df.format(d)); 

輸出:

1.2 

爲Thisaru Guruge說和霍爾迪卡斯蒂利亞回答,您可以使用這樣的:

double d = 1.2; 
    DecimalFormat df = new DecimalFormat("#.00"); 
    System.out.print(df.format(d)); 

輸出:

1.20 
+1

,這會顯示'0.00'爲'0.0'。不是'0.00' 使用'DecimalFormat(「0.00」)''會做。 參考:http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html –

+1

編輯感謝指出 – Sarz

0

你可以試試BigDecimal,或者你可以簡單地cr使用自己的實現Comparable接口進行排序的對象,並使用toString()方法輸出格式化爲兩位小數的值。

class TableValue implements Comparable<TableValue> { 

    double value; 

    public TableValue(double value) { 
     this.value = value; 

    } 

    public int compareTo(TableValue o) { 
     return Double.compare(this.value, o.value); 
    } 


    public String toString() { 
     DecimalFormat df = new DecimalFormat("0.00"); 
     return df.format(value); 
    } 
} 
0

雙精度不精確,BigDecimal有一個額外的屬性:精度。

所以new BigDecimal("5.20")將有一個2的精度,而雙5.20 * 10000可能足夠偏離52000.0。

介意可避免的new BigDecimal(5.20)既不知道精度,也不準確。

不幸的是BigDecimal有一個COBOListic用法。

+0

如果您認爲BigDecimal本質上是精確的,請嘗試計算1/3使用它。在這種情況下,它確實具有優於雙倍的優勢 - 精確表示所有短小數。 –

0

這個答案擴展了使用java.math.BigDecimal而不是double的建議。

對於這個應用程序比雙重更好,因爲每兩個小數位數都可以在BigDecimal中精確表示。可以根據幾種舍入模式中的任何一種(包括用於雙重算術的模式)輕鬆完成從任意雙倍表示值到小數點後兩位的舍入。

另一方面,它比String更好,因爲自然排序順序是數值。

下面是一個短的演示程序示出這些點:

import java.math.BigDecimal; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Collections; 
import java.util.List; 

public class Test { 
    public static void main(String[] args) throws Throwable { 
    List<BigDecimal> list = new ArrayList<BigDecimal>(); 
    double[] in = { 
     3.5, 
     Math.PI, 
     -100.123456, 
     1e6 
    }; 
    System.out.println("Original doubles: "+Arrays.toString(in)); 
    for(double d : in){ 
     list.add(doubleToBigDecimal(d,1)); 
    } 
    System.out.println("Before sorting: " + list); 
    Collections.sort(list); 
    System.out.println("After sorting: " + list); 
    } 

    public static BigDecimal doubleToBigDecimal(double in, int places) { 
    BigDecimal result = new BigDecimal(in).setScale(2, 
     BigDecimal.ROUND_HALF_EVEN); 
    return result; 
    } 
} 

輸出:

Original doubles: [3.5, 3.141592653589793, -100.123456, 1000000.0] 
Before sorting: [3.50, 3.14, -100.12, 1000000.00] 
After sorting: [-100.12, 3.14, 3.50, 1000000.00] 
相關問題