簡體   English   中英

如何打印小數點,直到沒有兩個重復的零?

[英]How can I print decimal places, up-to the point there are not two repeating zeros?

我想更改以下輸出

5250.000000000000 
5512.500000000000 
5788.125000000001 
6077.531250000001 
6381.407812500002 
6700.478203125002 
7035.502113281253 
7387.277218945315 
7756.641079892581 
8144.47313388721    

到下面的輸出。

5250.0
5512.5
5788.125
6077.53125
6381.4078125
6700.478203125
7035.50211328125
7387.277218945313
7756.641079892578
8144.473133887207

因此,看來我需要的邏輯是僅在小數位中少於兩個重復的0時才打印小數位。 我假設printf可以解決這個問題,但是如果我真的知道,我不會問。

我是看錯了問題,還是在鍵入時改變了它,我的原始答案表明DecimalFormat無法滿足您的需求。 正則表達式將:

final String unformatted = Double.toString(6381.407812500002);
final String formatted = unformatted.replaceAll("00+\\d*$", "");
System.out.println(formatted);

產量: 6381.4078125

您要求輸入兩個以上的零以及要替換的所有數字,因此它匹配00后跟任意數字(不匹配.因此僅在小數點后進行修整)並將其刪除。


原始答案:

幾乎所有數字格式需求的答案都是DecimalFormat(javadoc)。 專門針對這種情況:

NumberFormat formatter = new DecimalFormat("0.###########");
System.out.println(formatter.format(5788.125000000001));

產量: 5788.125

在這種情況下,我最多指定11個小數位,舍入后的位數都不能超過,並且使用# (而不是小數點后的0 )告訴它在該位置不顯示尾隨的0。

一種方法是構造一個regex ,該regex將從給定字符串中刪除不需要的尾隨零。 像下面這樣的事情會幫你的忙。 只需將此正則表達式放入正在讀取文件的循環中即可。

  // The 1-9 group would erase the last trailing
  //   non-zero digit, as suggested by the example
  somevariable  = str.replaceAll("0+[1-9]?$", "");

這是您的操作方式。 我正在使用double,但您也可以對float進行相同的操作。

double doubleValue = 1001.10210010138200321;
String doubleString = Double.toString(doubleValue);
String[] part = doubleString.split("\\.");
String decimalPart = part[1].substring(0, part[1].indexOf("00"));
String trimmedDoubleString = part[0] + "." + decimalPart;
double trimmedDouble = Double.parseDouble(trimmedDoubleString);

暫無
暫無

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

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