This question already has answers here:
How can I force division to be floating point? Division keeps rounding down to 0?
(11个答案)
4个月前关闭。
我正在做一个数学项目,用户根据他们选择的难度级别回答问题!
但是每次问题是除法问题时,它都会返回下界。
例如,如果代码询问什么是“ 5/3”,则答案应为2,但代码认为正确答案为1。
这是我的代码:
这是发生了什么:
(11个答案)
4个月前关闭。
我正在做一个数学项目,用户根据他们选择的难度级别回答问题!
但是每次问题是除法问题时,它都会返回下界。
例如,如果代码询问什么是“ 5/3”,则答案应为2,但代码认为正确答案为1。
这是我的代码:
using System;
namespace mathstester
{
class Program
{
enum UserDifficulty
{
Easy,
Normal,
Hard
}
public static void Main(string[] args)
{
string userDifficulty = "";
do
{
Console.WriteLine("What difficulty level would you like to do! Please type E for Easy, N for Normal and H for hard");
userDifficulty = Console.ReadLine().ToUpper();
} while (userDifficulty != "E" && userDifficulty != "N" && userDifficulty != "H");
int numberOfQuestions = 0;
do
{
Console.Write("How many questions would you like to answer? Please type a number divisible by 10!");
int.TryParse(Console.ReadLine(), out numberOfQuestions);
} while (numberOfQuestions % 10 != 0);
int numberOfQuestionsLeft = numberOfQuestions;
Random random = new Random();
int score = 0;
while (numberOfQuestionsLeft > 0)
{
var operation = random.Next(1, 7);
int number1 = 0;
int number2 = 0;
switch (userDifficulty)
{
case "E":
switch (operation)
{
case 1:
number1 = random.Next(1000);
number2 = random.Next(1000);
break;
case 2:
number1 = random.Next(1000);
number2 = random.Next(1000);
break;
case 3:
number1 = random.Next(13);
number2 = random.Next(13);
break;
}
break;
case "N":
switch (operation)
{
case 1:
number1 = random.Next(1000);
number2 = random.Next(1000);
break;
case 2:
number1 = random.Next(1000);
number2 = random.Next(1000);
break;
case 3:
number1 = random.Next(1000);
number2 = random.Next(1000);
break;
case 4:
number1 = random.Next(1, 10000);
number2 = random.Next(1, 1000);
break;
}
break;
case "H":
switch (operation)
{
case 3:
number1 = random.Next(1000);
number2 = random.Next(1000);
break;
case 4:
number1 = random.Next(1, 10000);
number2 = random.Next(1, 1000);
break;
case 5:
number1 = random.Next(13);
number2 = random.Next(5);
break;
case 6:
number1 = random.Next(1000);
break;
}
break;
}
if(operation == 1 && (userDifficulty == "E" || userDifficulty == "N"))
{
Console.Write($"What is {number1} + {number2} =");
int correctAnswer = number1 + number2;
int userAnswer = Convert.ToInt32(Console.ReadLine());
if (correctAnswer == userAnswer)
{
Console.WriteLine("Well Done!");
score++;
}
else
{
Console.WriteLine("Your answer is incorrect!");
}
numberOfQuestionsLeft--;
}
else if (operation == 2 && (userDifficulty == "E" || userDifficulty == "N"))
{
Console.Write($"What is {number1} - {number2} =");
int correctAnswer = number1 - number2;
int userAnswer = Convert.ToInt32(Console.ReadLine());
if (correctAnswer == userAnswer)
{
Console.WriteLine("Well Done!");
score++;
}
else
{
Console.WriteLine("Your answer is incorrect!");
}
numberOfQuestionsLeft--;
}
else if (operation == 3 && (userDifficulty == "E" || userDifficulty == "N" || userDifficulty == "H"))
{
Console.Write($"What is {number1} * {number2} =");
int correctAnswer = number1 * number2;
int userAnswer = Convert.ToInt32(Console.ReadLine());
if (correctAnswer == userAnswer)
{
Console.WriteLine("Well Done!");
score++;
}
else
{
Console.WriteLine("Your answer is incorrect!");
}
numberOfQuestionsLeft--;
}
else if (operation == 4 && (userDifficulty == "N" || userDifficulty == "H") && (number1 > number2))
{
Console.Write($"To the nearest integer, What is {number1} / {number2} =");
double correctAnswer = (number1 / number2);
double roundedCorrectAnswer = Math.Round(correctAnswer);
int userAnswer = Convert.ToInt32(Console.ReadLine());
if (roundedCorrectAnswer == userAnswer)
{
Console.WriteLine("Well Done!");
score++;
}
else
{
Console.WriteLine("Your answer is incorrect!");
}
numberOfQuestionsLeft--;
}
else if (operation == 5 && userDifficulty == "H")
{
Console.Write($"What is {number1} ^ {number2} =");
double correctAnswer = Math.Pow(number1, number2);
int userAnswer = Convert.ToInt32(Console.ReadLine());
if (correctAnswer == userAnswer)
{
Console.WriteLine("Well Done!");
score++;
}
else
{
Console.WriteLine("Your answer is incorrect!");
}
numberOfQuestionsLeft--;
}
else if (operation == 6 && userDifficulty == "H")
{
Console.Write($"To the nearest integer, What is √{number1} =");
double correctAnswer = Math.Sqrt(number1);
double roundedCorrectAnswer = Math.Round(correctAnswer);
int userAnswer = Convert.ToInt32(Console.ReadLine());
if (roundedCorrectAnswer == userAnswer)
{
Console.WriteLine("Well Done!");
score++;
}
else
{
Console.WriteLine("Your answer is incorrect!");
}
numberOfQuestionsLeft--;
}
}
Console.WriteLine($"You got a score of {score} out of {numberOfQuestions}");
}
}
}
这是发生了什么:
最佳答案
问题在于行double correctAnswer = (number1 / number2);
,右侧的表达式是两个整数的除法,因此将其作为整数除以四舍五入。然后将该整数值转换为双精度值,但四舍五入已经完成。要存储数字1 /数字2的实际值(可能是非整数),您需要在除法之前将其中一个或两个都转换为双精度值:
double correctAnswer = ((double) number1) / ((double) number2);
08-16 11:14