Java 阵列中奇怪的双重打印

Java 阵列中奇怪的双重打印,java,arrays,printing,double,Java,Arrays,Printing,Double,我正在编写一个程序,它打印一个数组,其中包含作为参数传递的两个数组的值之和。除了最后一个double值之外,所有这些都可以正常工作。我希望最后一个值打印为3.1。而是打印以下内容: [5.9,11.7,2.4,3.099999996] 不知道如何格式化打印,否则我不允许使用字符串来解决它。我没有其他价值观的问题。这是我的代码,谢谢你的帮助 import java.util.*; class Sum { public static void main (String [] arg

我正在编写一个程序,它打印一个数组,其中包含作为参数传递的两个数组的值之和。除了最后一个double值之外,所有这些都可以正常工作。我希望最后一个值打印为3.1。而是打印以下内容:

[5.9,11.7,2.4,3.099999996]


不知道如何格式化打印,否则我不允许使用字符串来解决它。我没有其他价值观的问题。这是我的代码,谢谢你的帮助

    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;

    }
}
import java.util.*;
班级总数
{
公共静态void main(字符串[]args)
{
双[]a1={4.5,2.8,3.4,0.8};
双[]a2={1.4,8.9,-1.0,2.3};
arraySum(a1,a2);
System.out.println(Arrays.toString(arraySum(a1,a2));
}
公共静态双[]阵列数(双[]x,双[]y)
{
整数长度=0;
double[]和=新的double[x.长度];
长度=x.长度;

对于(inti=0;i您希望使用deciaml格式

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

这是由于IEEE浮点模型造成的。它不能准确地表示
3.1
。要按您的需要打印它,您必须手动执行,而不是使用
数组。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();
}

若要仅使用双精度,您可以尝试应用此方法,但这是肮脏的且不保证有效:

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

这个数字仍然是正确的,如果你绕过一个合理数量的SigFig,这是DecimalFormat和String.format将在封面下为你做的事情。因为@ NeimNM说这是由同一个问题引起的。如果你真的是一个大问题,那么实际数字代表的是SigFigs>~ 8,而不是考虑使用BigDimple作为W。我永远不会丢失任何精度。

如果不允许使用
System.out.printf()
来解决这个问题,那么你唯一的选择就是使用
bigdecimic
对象来保存这些值。如果没有这两种方法中的一种,你将永远无法从
double
中得到
3.1
结果(或
DecimalFormat

你说你“不能用字符串来解决它”,但我不认为这样做

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

符合“使用字符串来解决它”的条件。对我来说似乎完全合法。

问题是我不能使用字符串来解决它…好答案,唯一的批评是字符串。format必须为数组中的每个元素解析格式字符串。也许十进制格式更有效。@LINEMAN78:谢谢,我修复了:)我不允许使用字符串来设置问题的格式,但是…这是因为二进制浮点,这是程序员必须知道的最基本的事情之一
for (double d : arraySum (a1, a2)) {
    System.out.printf("%.1f\n", d);
}