当我使用 Math.Round() 它总是 returns 下限
When I use Math.Round() it always returns the lower bound
我正在做一个数学项目,用户根据他们 select!
的难度水平回答问题
但是每道题都是除法题returns下界
例如,如果代码询问什么是“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);
行,右边的表达式是两个整数的除法,因此作为整数除法完成,向下舍入。然后将该整数值转换为双精度值,但舍入已经发生。要存储 number1 / number2 的实际值(可能是非整数),您需要在除法之前将其中一个或两个都转换为双精度值:
double correctAnswer = ((double) number1) / ((double) number2);
由于 number1
和 number2
是整数,将它们相除将使用 integer division 完成,并且只保留结果的 "whole" 部分(即部分小数点左边)。
您可以在执行除法之前将它们(或至少其中一个)转换为 double
s 以获得 "proper" 结果:
double correctAnswer = ((double) number1) / number2;
我正在做一个数学项目,用户根据他们 select!
的难度水平回答问题但是每道题都是除法题returns下界
例如,如果代码询问什么是“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);
行,右边的表达式是两个整数的除法,因此作为整数除法完成,向下舍入。然后将该整数值转换为双精度值,但舍入已经发生。要存储 number1 / number2 的实际值(可能是非整数),您需要在除法之前将其中一个或两个都转换为双精度值:
double correctAnswer = ((double) number1) / ((double) number2);
由于 number1
和 number2
是整数,将它们相除将使用 integer division 完成,并且只保留结果的 "whole" 部分(即部分小数点左边)。
您可以在执行除法之前将它们(或至少其中一个)转换为 double
s 以获得 "proper" 结果:
double correctAnswer = ((double) number1) / number2;