Java 将浮点设置为最大N位小数

Java 将浮点设置为最大N位小数,java,floating-point,numbers,format,Java,Floating Point,Numbers,Format,我想将一个数字的格式设置为最多N位小数。有,但那不是我想要的 我在找这样的东西,假设我最多想要2个位置,那么这将是: 1.00 -> "1" (not "1.00") 1.20 -> "1.2" (not "1.20") 1.23 -> "1.23" 1.234 -> "1.23" 1.235 -> "1.24" 与另一个问题不同的是,如果我不需要逗号,我不希望在逗号后面尾随零 我想知道这是否适用于String.format(),而不是Math.ro

我想将一个数字的格式设置为最多N位小数。有,但那不是我想要的

我在找这样的东西,假设我最多想要2个位置,那么这将是:

1.00  -> "1"    (not "1.00")
1.20  -> "1.2"  (not "1.20")
1.23  -> "1.23"
1.234 -> "1.23"
1.235 -> "1.24"
与另一个问题不同的是,如果我不需要逗号,我不希望在逗号后面尾随零

我想知道这是否适用于
String.format()
,而不是
Math.round()
,或DecimalFormat。上面显示的另一个问题提供了DecimalFormat的解决方案

答案不需要是变量N作为参数。我只是选择了N作为例子。

您可以使用

引用文件:

您可以使用DecimalFormat类将十进制数格式化为特定于语言环境的字符串。此类允许您控制前导零和尾随零、前缀和后缀、分组(千)分隔符和小数分隔符的显示

磅符号(#)表示一个数字,句点是小数的占位符 分离器

输出:

1
1.2
1.23
1.23
1.24
更新:由于您更新了问题,并且希望使用String.format,因此在中搜索时会发现此问题,并利用技巧加正则表达式。所以,你可以用这样的方法:

public static void main (String[] args) throws java.lang.Exception
{
    System.out.println(fmt(1.00));
    System.out.println(fmt(1.20));
    System.out.println(fmt(1.23));
    System.out.println(fmt(1.234));
    System.out.println(fmt(1.235));
}

public static String fmt(double d)
{
    if(d == (long) d)
        return String.format("%d",(long)d);
    else
        return String.format("%.2f",d).replaceAll("0*$", "");
}
输出为:

1
1.2
1.23
1.23
1.24

无论如何,我会使用DecimalFormat

另一种解决方案如果您仍然想使用
String.format()
,下面是解决方案:

Java代码:ParseN.Java

public class ParseN{

     public static void main(String []args){
        System.out.println(parseN(1.00));
        System.out.println(parseN(1.20));
        System.out.println(parseN(1.23));
        System.out.println(parseN(1.234));
        System.out.println(parseN(1.235));
     }

     static String parseN(Double d)
     {
       String s = String.format("%.2f", d);
       s = s.indexOf(".") < 0 ? s : s.replaceAll("0*$", "").replaceAll("\\.$", "");
       return s;
     }
}

希望它能完全回答你的问题。另外,请参阅。

您还可以使用
setMaximumFractionDigits(…)
控制
DecimalFormat
的格式,如下所示:

double d = 1.234567;
DecimalFormat df = new DecimalFormat();
for (int i = 2; i < 6; ++i) {
  df.setMaximumFractionDigits(i);
  System.out.println(df.format(d));
}
double d=1.234567;
DecimalFormat df=新的DecimalFormat();
对于(int i=2;i<6;++i){
df.setMaximumFractionDigits(i);
System.out.println(df.format(d));
}
这可能比使用
StringBuilder
或类似工具生成格式更适合您的用例。

使用NumberFormat

NumberFormat format = NumberFormat.getInstance();
format.setMaximumFractionDigits(2); // or N

System.out.println(format.format(1)); // -> 1
System.out.println(format.format(1.2)); // -> 1.2
System.out.println(format.format(1.23)); // -> 1.23
System.out.println(format.format(1.234)); // -> 1.23
System.out.println(format.format(1.235)); // -> 1.24
NumberFormat也适用于区域设置,您可以更改舍入模式

NumberFormat format = NumberFormat.getInstance(Locale.GERMANY);
format.setMaximumFractionDigits(2);
format.setRoundingMode(RoundingMode.CEILING);

System.out.println(format.format(1)); // -> 1
System.out.println(format.format(1.2)); // -> 1,2
System.out.println(format.format(1.23)); // -> 1,23
System.out.println(format.format(1.234)); // -> 1,24
System.out.println(format.format(1.235)); // -> 1,24

请查看您提到的问题的第二个答案。查看(您链接到的问题的答案之一)发布的仅使用String.format()的解决方案@Arkadiy-第二个答案是DecimalFormat,而不是String.format(),对吗?您可以使用DecimalFormat和%sHow将小数点放在
N
?@4castle只需确保格式字符串的小数点后有N
#
符号。有没有办法用格式化程序对其进行编码,或者您必须使用
StringBuilder
在循环中构建模式?@4castle:您可以根据需要放置多个。以1为例。如果#被找到了,那么它就被使用了,不是什么都没发生。与使用00####00不同,00###00将用零填充剩余的字符。我从一开始提到的另一个问题有一个DecimalFormat的解决方案。我想知道String.format()的解决方案是什么(假设有)。您可以将2个正则表达式合并为
\\?0*$
。此外,结果字符串中始终会有一个小数点,因此不需要
indexOf
三元。如果将
N
放入格式字符串中,这可能是迄今为止最完整的答案。默认情况下,
DecimalFormat
使用的是将
5
四舍五入时意外发生的行为。要解决这个问题,请执行df.setRoundingMode(RoundingMode.HALF_UP)在您的第二个区块中,
格式化程序发生了一个小故障。它可能应该是
格式
NumberFormat format = NumberFormat.getInstance();
format.setMaximumFractionDigits(2); // or N

System.out.println(format.format(1)); // -> 1
System.out.println(format.format(1.2)); // -> 1.2
System.out.println(format.format(1.23)); // -> 1.23
System.out.println(format.format(1.234)); // -> 1.23
System.out.println(format.format(1.235)); // -> 1.24
NumberFormat format = NumberFormat.getInstance(Locale.GERMANY);
format.setMaximumFractionDigits(2);
format.setRoundingMode(RoundingMode.CEILING);

System.out.println(format.format(1)); // -> 1
System.out.println(format.format(1.2)); // -> 1,2
System.out.println(format.format(1.23)); // -> 1,23
System.out.println(format.format(1.234)); // -> 1,24
System.out.println(format.format(1.235)); // -> 1,24