C# 在自定义类中获取 int 的第一个数字
本文关键字:int 第一个 数字 获取 自定义 | 更新日期: 2023-09-27 18:31:47
我正在尝试在我的猜测数字游戏中构建一个帮助函数,用户获得他/她必须猜测的数字的第一个数字。因此,如果生成的数字是 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);
}
}
}
在帮助按钮下单击我有:
private void helpButton_Click(object sender, EventArgs e)
{
label3.Text = globalVariableNumber.helpMe;
label3.AutoSize = true;
这是我的最新尝试,我将所有这些放在一个自定义类中。总的来说,我输入了代码以显示helpMe字符串中的内容。
如果您需要更多代码,请告诉我
为什么不对数字进行 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))));
怎么了 - 你有一个无限的 while 循环。Math.Round(test) 将在第一次迭代后保持 test 的值不变。您可能打算使用 firstDigit 作为控制循环的变量。无论如何,正如其他人建议的那样,您可以通过转换为字符串并使用第一个字符将 helpMe 设置为第一位数字。顺便说一句,您应该考虑提供数字作为参数,并从该方法返回 helpMe 字符串。您目前的方法有点脆弱。
代码的问题在于您正在执行除法并将其存储在单独的变量中,然后将原始值四舍五入。这意味着原始值仅在循环的第一次迭代中更改(并且只是舍入的,而不是除法的),除非这恰好使循环条件为假(即对于 10 到 10.5 之间的值),否则循环永远不会结束。
变化:
- 使用
int
double
,这样可以使您远离一大堆潜在的精度问题。 - 使用
>=
运算符而不是>
。如果您得到的值10
则希望循环继续进行另一次迭代以获得一位数。 - 您将使用
Math.Floor
而不是Math.Round
,因为您不希望将第一个数字四舍五入,即获取460
的第一个数字作为5
。但是,如果您使用的是整数,则除法会截断结果,因此根本不需要进行任何舍入。
将 - 值除以并将其存储回同一变量中。 在
- 循环后使用该值,在变量中仍有多个数字的情况下更新它是没有意义的。
法典:
int test = (int)globalVariableNumber.number;
while (test >= 10) {
test = test / 10;
}
globalVariableNumber.helpMe = test.ToString();
通过使用 Math.Round(),在您的示例中,您将 5.5 四舍五入到 6(这是每个文档中的偶数整数)。 改用 Math.Floor,这将删除小数点,但为您提供此测试所需的数字。
即
double test = Convert.ToDouble(globalVariableNumber.number);
while (test > 10)
{
test = Math.Floor(test / 10);
globalVariableNumber.helpMe = Convert.ToString(firstDigit);
}
不过,就像 Greenhalgh 提到的@Sam的那样,将数字的第一个字符作为字符串返回会更干净、更快、更容易。
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.
}