我在平均显示小数时遇到问题。它一直显示.00或.1。 我试图把它放在一起,但我仍然得到相同的结果。另外,我想包括我输入的第一个整数,但我不知道如何。请帮助:
import java.io.*;
import java.util.*;
public class WhileSentinelSum
{
static final int SENTINEL= -999;
public static void main(String[] args)
{
// Keyboard Initialization
Scanner kbin = new Scanner(System.in);
//Variable Initialization and Declaration
int number, counter;
int sum =0;
int average;
//Input
System.out.print("Enter an integer number: " );
number = kbin.nextInt();
counter=0;
//Processing
//Output
while(number != SENTINEL)
{
counter++;
System.out.print("Enter an integer number: ");
number = kbin.nextInt();
sum += number;
}
if (counter !=0)
System.out.println("\nCounter is: " + counter);
else
System.out.println("no input");
average= sum/counter;
System.out.println("The sum is " + sum);
System.out.println("The average is " + average);
System.out.println();
}//end main
}//end class
答案 0 :(得分:5)
即使您将average
声明为double
,sum
和counter
变量也是int
,因此Java之前仍使用integer division将其分配给average
,例如5 / 10
会产生0
而不是0.5
。
在分区之前将其中一个变量强制转换为double
以强制执行浮点操作:
double average;
...
average = (double) sum / counter;
您可以在进入while循环之前处理计算中的第一个数字(如果它不是sentinel值)。
答案 1 :(得分:1)
average = sum/counter;
此行正在执行整数除法(即它会切断真实结果的小数部分)。你应该把它改成
average = (double) sum / counter; // perform double division, not int division
首先将sum
转换为double
,然后执行常规双重除法。
请注意,您需要将average
变量的类型更改为double
。
只是为了说明我的观点:
int a = 3;
int b = 2;
System.out.println(a / b);
System.out.println((double) a / b);
1 1.5
答案 2 :(得分:1)
看起来问题就在于
average = sum/counter;
即使您将average
设为double
,sum/counter
仍然是整数除法,它将产生整数答案。你可以尝试说
double average = ((double)sum)/counter;
另一种解决方案是制作sum
类型的counter
或double
,并将average
设为double
。
答案 3 :(得分:0)
初始化总和和平均值加倍。 使用kbin.nextDouble()。
答案 4 :(得分:0)
据说:如果需要确切的结果,请不要使用double
或float
。您应该更喜欢BigDecimal
。原语不会使用大多数人所期望的舍入模式。