我正在處理一個項目,該項目要求我在正好兩位小數的位置有兩個值。使用一些數學,我目前有大多數數字正確圓整,除非有尾隨零。我想保留這些0的結果,如0.00特別是此列表顯示在TableView中,因此必須按數字排序。我希望double值實際上是雙打的,以便它可以正確排序。Fomat Double到2小數位不使用字符串
有什麼辦法可以保留2位小數沒有String.format?
預先感謝您。
我正在處理一個項目,該項目要求我在正好兩位小數的位置有兩個值。使用一些數學,我目前有大多數數字正確圓整,除非有尾隨零。我想保留這些0的結果,如0.00特別是此列表顯示在TableView中,因此必須按數字排序。我希望double值實際上是雙打的,以便它可以正確排序。Fomat Double到2小數位不使用字符串
有什麼辦法可以保留2位小數沒有String.format?
預先感謝您。
可以使用的DecimalFormat
DecimalFormat df = new DecimalFormat("#.00");
00
= 恰好兩位小數。
但是這會給你一個String
,你可以再次轉換爲double
,如果你不希望有這種String-conversion
check this question,看看它如何使用BigDecimal
實現。
恕我直言,如果這不是學習pourposes DecimalFormat
將足夠你。的確,你將在轉換的某一時刻使用String
,但你只會讀取和存儲double
值,你的排序將是正確的......
我主要關心的是這些double值在TableView中顯示。表格本身可以通過選擇一個列進行排序 - 工作正常。表單元格顯示存儲爲SimpleDoubleProperty的double值。四捨五入到小數點後兩位是正常工作,除非有尾隨零,所以我試圖找到解決辦法。防爆。 2.50而不是2.5 – user3806226
所以'double-String-double'就是你需要的 –
您可以使用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
,這會顯示'0.00'爲'0.0'。不是'0.00' 使用'DecimalFormat(「0.00」)''會做。 參考:http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html –
編輯感謝指出 – Sarz
你可以試試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);
}
}
雙精度不精確,BigDecimal有一個額外的屬性:精度。
所以new BigDecimal("5.20")
將有一個2的精度,而雙5.20 * 10000可能足夠偏離52000.0。
介意可避免的new BigDecimal(5.20)
既不知道精度,也不準確。
不幸的是BigDecimal有一個COBOListic用法。
如果您認爲BigDecimal本質上是精確的,請嘗試計算1/3使用它。在這種情況下,它確實具有優於雙倍的優勢 - 精確表示所有短小數。 –
這個答案擴展了使用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]
重複:http://stackoverflow.com/questions/5945867/how-to-round-the -double-value-to-2-decimal-points – JohannisK
僅供參考,當googleing round double 2小數位時首次觸發java – JohannisK
爲什麼double而不是BigDecimal? –