下面是我的代码,我的情况是我试图让百分比数组输出2位小数的%,但是我一直收到有关从double到int的有损转换的错误,我已经尝试将我的数组作为百分比无论是int还是double,但我都没有运气。
我需要做些什么来让它显示百分比而不是0或错误?
import java.util.Scanner; // import Scanner class
import java.security.SecureRandom;
public class DiceSim
{
public static final SecureRandom rand = new SecureRandom();
public static final Scanner user = new Scanner(System.in); // create scanner object called input
// start main method
public static void main (String[] args)
{
double[] percent = new double[13];
int roll1 = 0;
int roll2 = 0;
System.out.printf("%n *******************************");
System.out.printf("%n *** Dice Rolling Simulation ***");
System.out.printf("%n *******************************");
System.out.println();
System.out.printf("%n Enter the number of rolls: ");
int input = user.nextInt();
System.out.println();
int[] frequency = new int[13];
for (int counter = 0; counter < input; counter++)
{
roll1 = diceRoll();
roll2 = diceRoll();
int total = roll1+roll2;
++frequency[total];
double fraction = (100.00*(total/input));
++percent[fraction];
}
System.out.printf("%s %12s %12s %n", " Sum", "Frequency", "Percentage" );
for (int Sum = 2; Sum<percent.length; Sum++)
{
System.out.printf("%4d %12d %12d %n", Sum, frequency[Sum], percent[Sum]);
}
System.out.println();
}
public static int diceRoll()
{
int dice = 1 + rand.nextInt(6);
return dice;
}
}
答案 0 :(得分:2)
所有数组索引的第1个不能是double。在这里:
++percent[fraction];
第二次将%d更改为%f。在这里:
System.out.printf("%4d %12d %12d %n", Sum, frequency[Sum], percent[Sum]);
答案 1 :(得分:0)
%d
用于小数。您希望将%f
用于浮点数和双精度数。有关格式化的信息,请参阅文档:Formatter
另外,当你使用int时你得到0的原因是因为Java会截断浮点数和小数 - 它不会舍入它们。您的百分比可能小于100%,因此它们小于1.如果它在0和1之间的任何值,它将被截断为0。
更新: 您的问题是因为您使用double来访问带有
的数组索引double fraction = (100.00*(total/input));
++percent[fraction];
采用int。所以这意味着它必须从一个64位的双精度转换为一个整数...我甚至不认为应该编译,所以我不确定你是如何得到的#&#i 34;精度损失&#34;。