Java 将双精度数组打印到小数点后2位

Java 将双精度数组打印到小数点后2位,java,arrays,Java,Arrays,我有一个double数组,希望将它打印到控制台,精确到小数点后2位 double[] ary = {12.4324324, 14.5432, 58.3412}; System.out.println(Arrays.toString(ary)); 目前这将打印出来 [12.4324324, 14.5432, 58.3412] 但是我想把它打印出来 [12.43, 14.54, 58.34] 是否有某种方法可以使用数组。toString()执行此操作,或者我必须迭代数组中的每个值并单独打印它们

我有一个double数组,希望将它打印到控制台,精确到小数点后2位

double[] ary = {12.4324324, 14.5432, 58.3412};
System.out.println(Arrays.toString(ary));
目前这将打印出来

[12.4324324, 14.5432, 58.3412]
但是我想把它打印出来

[12.43, 14.54, 58.34]

是否有某种方法可以使用
数组。toString()
执行此操作,或者我必须迭代数组中的每个值并单独打印它们?

您需要迭代数组并使用decimalFormat更新十进制数组

DecimalFormat decimalFormat = new DecimalFormat("#.##");
double[] ary = {12.4324324, 14.5432, 58.3412};
int i =0;
for (double d : ary) {
     ary[i] = Double.valueOf(decimalFormat.format(d));
     i++;
}
System.out.println(Arrays.toString(ary));
以上程序的输出

[12.43, 14.54, 58.34]

您需要迭代每个值以使用2个小数点打印。 使用Java8,您可以使用下面的一行代码

    double[] ary = { 12.4324324, 14.5432, 58.3412 };
    DecimalFormat df = new DecimalFormat("0.00");
    Arrays.stream(ary).forEach(e -> System.out.print(df.format(e) + " " ));

我建议使用必要的格式选项简单地实现一个适当的
toString
方法,并以一种方便的方法传递所需的“默认”格式:

import java.util.Locale;

public class DoubleArrayString
{
    public static void main(String[] args)
    {
        double[] array = { 12.4324324, 14.5432, 58.3412 };

        System.out.println(toString(array));
    }

    private static String toString(double array[])
    {
        return toString(array, Locale.ENGLISH, "%.2f");
    }

    private static String toString(double array[], Locale locale, String format)
    {
        if (array == null)
        {
            return "null";
        }
        StringBuilder sb = new StringBuilder("[");
        for (int i=0; i<array.length; i++)
        {
            if (i > 0)
            {
                sb.append(", ");
            }
            sb.append(String.format(locale, format, array[i]));
        }
        sb.append("]");
        return sb.toString();
    }

}
即使
,输出也是

12.43 14.54 58.34
而不是期望的(也可能是预期的)


此外,“将数组的内容打印到控制台”和“使用数组的内容创建字符串”(然后可以打印到控制台)之间存在差异。上面显示的方法是一个具有一个且只有一个功能的构建块,您还可以使用它打印到
System.err
或任何其他“字符串使用者”中。

我投票赞成这个答案,因为它保留了原始数组的完整性,并提供了所需格式的干净实现。请注意,此构造函数将创建。要获得始终使用特定区域设置的实例,您需要使用工厂方法(如+1)来提及隐藏的
locale
-依赖项。我建议使用一个而不是
StringBuilder
。@Hulk最初,我使用流和
收集器绘制了一个解决方案。加入(“,”
),但仍然需要添加
[…]
。最后,流的存在并不意味着它们总是优于循环。此实现类似于
数组#toString
,因此应该可以…还有3-args版本的。但是我没有建议在这里使用Streams,只是直接使用
StringJoiner
,它正是为这个用例设计的。@Hulk 3-args-version很方便。但在任何情况下,这个收集器都必须“喂养”一些东西,我认为唯一简洁的方法就是通过流。也许我会再看一眼,扩展一下答案,但我看不出有什么立竿见影的好处。我的意思是
StringJoiner sj=newstringjoiner(“,”,“[”,“]);for(double d:array){sj.add(String.format(locale,format,d));}返回sj.toString()
12.43 14.54 58.34
[12.43, 14.54, 58.34]