我正在编写一个打印一个数组的程序,该数组包含作为参数传递的两个数组的值之和。除了最后一个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;
}
}
答案 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来解决它”。对我来说似乎完全合法。