我怎样才能打印小数位,直到没有两个重复的零?
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
后跟任何数字(不匹配 .
所以这只会 trim 小数点后)并将其擦除。
原回答:
DecimalFormat (javadoc) 几乎可以满足您所有的数字格式化需求。专门针对这种情况:
NumberFormat formatter = new DecimalFormat("0.###########");
System.out.println(formatter.format(5788.125000000001));
产量:5788.125
在这种情况下,我指定最多 11 位小数,多于此的将四舍五入,并使用 #
(而不是小数点后的 0
)告诉它不要在该位置显示尾随 0。
一种方法是构造一个 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);
我想更改以下输出
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
后跟任何数字(不匹配 .
所以这只会 trim 小数点后)并将其擦除。
原回答:
DecimalFormat (javadoc) 几乎可以满足您所有的数字格式化需求。专门针对这种情况:
NumberFormat formatter = new DecimalFormat("0.###########");
System.out.println(formatter.format(5788.125000000001));
产量:5788.125
在这种情况下,我指定最多 11 位小数,多于此的将四舍五入,并使用 #
(而不是小数点后的 0
)告诉它不要在该位置显示尾随 0。
一种方法是构造一个 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);