Java 阵列中奇怪的双重打印
我正在编写一个程序,它打印一个数组,其中包含作为参数传递的两个数组的值之和。除了最后一个double值之外,所有这些都可以正常工作。我希望最后一个值打印为3.1。而是打印以下内容: [5.9,11.7,2.4,3.099999996]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
不知道如何格式化打印,否则我不允许使用字符串来解决它。我没有其他价值观的问题。这是我的代码,谢谢你的帮助
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);
}