数组奇怪的双重打印

时间:2013-12-17 00:36:02

标签: java arrays printing double

我正在编写一个打印一个数组的程序,该数组包含作为参数传递的两个数组的值之和。除了最后一个double值之外,一切正常。我希望最后一个值打印为3.1。而是打印以下内容:

[5.9,11.7,2.4,3.0999999999999996]

不知道如何格式化打印,否则因为我不允许使用String来解决它。我没有其他值的问题。这是我的代码,感谢您的帮助!

    import java.util.*;

class Sum
{
    public static void main (String [] args)
    {
        double [] a1 = {4.5, 2.8, 3.4, 0.8};
        double [] a2 = {1.4, 8.9, -1.0, 2.3};

        arraySum (a1, a2);

        System.out.println (Arrays.toString (arraySum (a1, a2)));   
    }

    public static double [] arraySum (double [] x, double [] y)
    {
        int length = 0;
        double [] sum = new double [x.length];
        length = x.length;

            for (int i = 0; i <= length - 1; i++)
            {
                sum[i] = x[i] + y[i];
            }

        return sum;

    }
}

4 个答案:

答案 0 :(得分:3)

您想使用小数格式

DecimalFormat df=new DecimalFormat("#.#");
String outputString=df.format(sum);

答案 1 :(得分:3)

这是由于IEEE浮点模型。它不能完全代表3.1。要按照您的需要进行打印,您必须手动执行,而不是使用Arrays.toString。循环遍历双打并格式化它们:

public static String toString(double[] x, DecimalFormat format)
{
    StringBuilder sb = new StringBuilder();
    sb.append("[");
    for (int i = 0; i < x.length; ++i)
    {
        sb.append(format.format(x[i]));
        sb.append(", ");
    }
    sb.delete(sb.length() - 2, sb.length());
    sb.append("]");
    return sb.toString();
}

然后打电话给:

toString(sum, new DecimalFormat("#.#"));

要仅使用双打执行此操作,您可能会尝试应用此功能,但这很脏并且无法保证可以正常工作:

double x = ...;
x = 0.001 * Math.round(x * 1000.0);
System.out.println(x);

答案 2 :(得分:0)

如果您舍入到合理数量的sigfigs,这个数字仍然是正确的,这就是DecimalFormat和String.format将为您做的事情。正如@neminem所说,这是由与Strange floating-point behaviour in a Java program相同的问题引起的。如果真的对你来说真的很重要,那么所代表的实际数字对于sigfigs来说是准确的。 〜8考虑使用BigDecimal,因为你永远不会失去任何精度。

答案 3 :(得分:0)

如果您不允许使用System.out.printf()来解决问题,那么您唯一的选择是使用BigDecimal个对象来保存值。 没有办法,如果没有这两种方法之一(或3.1),您将从double获得DecimalFormat结果。

你说你“不能用String来解决它”,但我不认为这样做......

for (double d : arraySum (a1, a2)) {
    System.out.printf("%.1f\n", d);
}

符合“使用String来解决它”。对我来说似乎完全合法。