我正在尝试在我猜数字游戏中构建一个帮助功能,即用户获得他/她必须猜测的数字的第一个数字。因此,如果生成的数字是550,他将获得5。
我尝试了很多东西,也许你们其中一个人知道出了什么问题?
public partial class Class3
{
public Class3()
{
double test = Convert.ToDouble(globalVariableNumber.number);
while (test > 10)
{
double firstDigit = test / 10;
test = Math.Round(test);
globalVariableNumber.helpMe = Convert.ToString(firstDigit);
}
}
}
在helpButton下单击我有:
private void helpButton_Click(object sender, EventArgs e)
{
label3.Text = globalVariableNumber.helpMe;
label3.AutoSize = true;
这是我最近的尝试,我把所有这些都放在了自定义类中。在主要内容中,我推出了代码以显示helpMe字符串中的内容。
如果您需要更多代码,请告诉我
答案 0 :(得分:2)
为什么不ToString数字并使用Substring来获取第一个字符?
var number = 550;
var result = number.ToString().Substring(0, 1);
如果由于某种原因你不想使用字符串操作,你可以像这样在数学上做到这一点
var number = 550;
var result = Math.Floor(number / Math.Pow(10, Math.Floor(Math.Log10(number))));
答案 1 :(得分:1)
出了什么问题 - 你在那里有一个无限的循环。 Math.Round(test)将在第一次迭代后保持测试值不变。 您可能打算使用firstDigit作为控制循环的变量。 无论如何,正如其他人所建议的那样,您可以通过转换为字符串并使用第一个字符将helpMe设置为第一个数字。 另外,您应该考虑提供数字作为参数并从方法返回helpMe字符串。你目前的方法有点脆弱。
答案 2 :(得分:1)
您的代码的问题在于您正在进行除法并将其存储在单独的变量中,然后您将原始值四舍五入。这意味着原始值仅在循环的第一次迭代中发生变化(并且仅舍入,而不是分割),除非发生使循环条件为假(即对于10到10.5之间的值),否则循环将永远不会结束
的变化:
int
的{{1}}整数,可以帮助您摆脱一大堆潜在的精确问题。double
运算符而不是>=
。如果得到值>
,那么您希望循环继续进行另一次迭代以获得单个数字。10
代替Math.Floor
,因为您不希望将第一个数字向上舍入,即将Math.Round
的第一个数字设为460
。但是,如果使用整数,则除法会截断结果,因此根本不需要进行任何舍入。代码:
5
答案 3 :(得分:0)
通过使用Math.Round(),在您的示例中,您将舍入5.5到6(它是每the documentation的偶数整数)。请使用Math.Floor,这将删除小数点,但会为您提供此测试所期望的数字。
即
double test = Convert.ToDouble(globalVariableNumber.number);
while (test > 10)
{
test = Math.Floor(test / 10);
globalVariableNumber.helpMe = Convert.ToString(firstDigit);
}
就像@Sam Greenhal提到的那样,将数字的第一个字符作为字符串返回将更清晰,更快捷,更容易。
globalVariableNumber.helpMe = test >= 10
? test.ToString().SubString(0, 1)
: "Hint not possible, number is less than ten"
这假设helpMe是一个字符串。
根据我们在评论中的讨论,你最好这样做:
private void helpButton_Click(object sender, EventArgs e)
{
label3.Text = GetHelpText();
label3.AutoSize = true;
}
// Always good practice to name a method that returns something Get...
// Also good practice to give it a descriptive name.
private string GetHelpText()
{
return test >= 10 // The ?: operator just means if the first part is true...
? test.ToString().SubString(0, 1) // use this, otherwise...
: "Hint not possible, number is less than ten" // use this.
}