簡體   English   中英

DecimalFormat - 格式化十進制以保留可變數量的尾隨零

[英]DecimalFormat - Format decimal to preserve variable amount of trailing zeros

我有一種情況,在使用 DecimalFormat 格式化為字符串時,我需要保留數字的小數位數,特別是對於尾隨零。 我需要使用 DecimalFormat,因為我還需要避免使用科學記數法來表示大數,正如這里所見,這是最好的方法。 但是,正如您在該帖子中看到的,提供的代碼還刪除了尾隨零,而我想保留它們。

1.00 -> "1.00"
1.000 -> "1.000"

我見過很多涉及固定小數位的問題,但在我的情況下,我需要考慮可變數量的小數位。 我研究了計算小數位數,但由於我的輸入也可以是 Double(除了 BigDecimal),似乎沒有可靠的方法來計算所有數字的小數點后的位數。 Double.toString() 不起作用,因為對於非常小和非常大的數字,雙打分成指數表示法。 有關為什么難以計算 double 中的小數位數的更多信息,請參見此處

“保留”尾隨零?

double值不知道您想看到多少個尾隨零。 它只是一個數字,而1.001.000是同一個數字,即數字1 你所要求的不能用double價值來完成

現在, BigDecimal確實記住尾隨零的數量,所以如果你想打印一個BigDecimal值,保留數字的比例,但確保它永遠不會以科學記數法打印,不要使用DecimalFormat ,而是使用toPlainString()

返回此BigDecimal的字符串表示形式,沒有指數字段


更新

如果您想打印一個double值與盡可能多的小數位數根據需要(即沒有尾隨零),並希望確保它在科學記數法從未打印,使用DecimalFormat具有非常高的MaximumIntegerDigits和非常高的setMaximumFractionDigits

“非常高”意味着值超出了double的范圍,因此999是一個很好的“整數”數字,盡管330已經足夠高了。

測試

DecimalFormat fmt = new DecimalFormat("0");
fmt.setMaximumIntegerDigits(330);
fmt.setMaximumFractionDigits(330);

System.out.println("0.0123400  = " + 0.0123400               + "   = " + fmt.format(0.0123400));
System.out.println("123400.00  = " + 123400.00                + "  = " + fmt.format(123400.00));
System.out.println("NaN        = " + Double.NaN          + "       = " + fmt.format(Double.NaN));
System.out.println("-INFINITY  = " + Double.NEGATIVE_INFINITY  + " = " + fmt.format(Double.NEGATIVE_INFINITY));
System.out.println("+INFINITY  = " + Double.POSITIVE_INFINITY + "  = " + fmt.format(Double.POSITIVE_INFINITY));
System.out.println("MIN_NORMAL = " + Double.MIN_NORMAL               + " = " + fmt.format(Double.MIN_NORMAL));
System.out.println("MIN_VALUE  = " + Double.MIN_VALUE + "                = " + fmt.format(Double.MIN_VALUE));
System.out.println("MAX_VALUE  = " + Double.MAX_VALUE               + "  = " + fmt.format(Double.MAX_VALUE));

輸出

0.0123400  = 0.01234   = 0.01234
123400.00  = 123400.0  = 123400
NaN        = NaN       = �
-INFINITY  = -Infinity = -∞
+INFINITY  = Infinity  = ∞
MIN_NORMAL = 2.2250738585072014E-308 = 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022250738585072014
MIN_VALUE  = 4.9E-324                = 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000049
MAX_VALUE  = 1.7976931348623157E308  = 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

double (無精度,總是近似值)或BigDecimal

使用 BigDecimal 作為new BigDecimal("2.00")定義兩位數的正確小數位數(精度)。 您可以以編程方式設置比例。

對於數據庫和計算(如金融)BigDecimal 很好。

BigDecimal.toPlainString()可以避免輸出的科學表示。

對於double一可以格式化

s = String.format("%10.2f", 13.5789); // "   13.58"

所有這些都帶有小數點,沒有千位分隔符。

國際化(本地化)軟件將使用帶有區域設置(顯式或默認平台區域設置)的MessageFormat

Locale.setDefault(new Locale("bg", "BG"));
s = MessageFormat.format("Number: {0, number, #.##}, "
            + "amount: {1, number, currency}",
            42.125, 19.99);

暫無
暫無

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

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