如何打印小数位,直到没有两个重复的零?

时间:2015-05-17 23:04:26

标签: java floating-point formatting

我想更改以下输出

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可以处理这个,但如果我真的知道,我不会问。

3 个答案:

答案 0 :(得分:2)

要么我误读了这个问题,要么在我打字时它发生了变化,我的原始答案暗示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。

答案 1 :(得分:1)

一种方法是构造一个regex,它将从给定的字符串中删除不需要的尾随零。像下面这样的东西会为你做。只需将此正则表达式放在正在读取文件的循环中。

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

答案 2 :(得分:1)

这是你如何做到的。我正在使用double,但你也可以做同样的浮动。

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);