我为我的课程编写的程序需要一行从0.5到42.9以及其他几行计数0.1。由于双精度不精确,程序计数0.1到0.7然后下一个数字变为0.799999999而不是8.我对纠正这个问题的代码有点不确定。我想说它与Math.abs和EPS有关,但我不确定。任何意见,将不胜感激。
{
System.out.println(" ");
final double MAX2 = 43;
for (double row = 0.5; row<MAX2; row+=0.1)
{
System.out.print(row);
if(row != MAX2 -1)
{System.out.print(",");
}//SOP COMMA
}//SOP ROW3
}//.5,42.9
最终结果是
0.5,0.6,0.7,0.7999999999999999,0.8999999999999999,0.9999999999999999,1.0999999999999999,1.2,1.3,1.4000000000000001,1.5000000000000002,1.6000000000000003,1.7000000000000004,1.8000000000000005,1.9000000000000006,2.0000000000000004,2.1000000000000005,2.2000000000000006,2.3000000000000007,2.400000000000001,2.500000000000001,2.600000000000001,2.700000000000001,2.800000000000001 ,2.9000000000000012等。
答案 0 :(得分:0)
一种简单的方法是使用printf将变量打印到1位小数。
public static void main(String[] args) {
System.out.println(" ");
final double MAX2 = 43;
for (double row = 0.5; row<MAX2; row+=0.1) {
System.out.printf("%.1f", row);
if(row != MAX2 -1) {
System.out.print(",");
}
}
}
答案 1 :(得分:0)
这是一个迭代问题它与双打无关。
你需要一个从5到429的for循环。 在循环内部,通过将循环索引除以10来计算double值。然后将该double值用于循环中的任何计算。
不要忘记在分割之前将索引转换为double,否则你将得到整数除法,这不会产生你需要的结果。