我有这个功能:
{{1}}
这用于获取字符串ASCII值的总数,但在此过程中进行一些数学运算而不仅仅是添加。我需要这个来返回总数,但是当前正在返回0.如何让它返回正确的值? (PS:它需要返回一个整数,但是这可以是double的数据类型,以便以后转换。基本上只需要它返回一个整数。)(PSPS:我不知道字符串是什么,它取决于最终用户)
_
答案 0 :(得分:1)
你可能误解了^符号。它代表按位异或或,而不是取幂。如果您想使用后者,请使用:
total = total * (5 * (Math.Pow (c, 2) / (c * 6));
但是,你可以写得更短/更漂亮/更高效:
total *= (5 * (c * c) / (6 * c));
我替换了Pow
,因为它比简单的乘法慢,并且使用了赋值运算符。
此外,方程本身可以简化:
total *= c * (5 / 6);
但是,您仍应将数字标记为双精度数,因为 5/6 会导致数字为0:
total *= c * (5.0 / 6.0)
有关C#中取幂的更多信息,请查看this。
顺便说一句,^符号取数字的每一位并比较它们。如果第一位或第二位,则新值将为1,但不是两位都为1。
所以例如 0101 xor 1110 会导致 1011 。
答案 1 :(得分:0)
你有施法问题。 c变量是整数。您的问题出在total = total * (5 * (c ^ 2) / (c*6));
表达式中。
由于内部结果(c ^ 2)
和(c*6)
不会加倍,当除法结果具有浮点数(例如0.nnnnn)时,最终结果不会加倍并且你得到只有0才是数字的真实部分。结果表达式(5 * (c ^ 2) / (c*6))
作为整数是0.最后表达式为total=total * (0);
在代码中使用内部演员 用以下内容替换您的代码:
total = total * (5 * ((double)(c ^ 2)) / ((double)(c * 6)));
请运行以下代码
static private double getTotal(string str)
{
double total = 0;
byte[] asciiBytes = Encoding.ASCII.GetBytes(str);
foreach (int c in asciiBytes)
{
double dC = c;
total = total + c;
double cXor2 = c ^ 2;
double c6 = c * 6;
double fiveCXor2 = 5 * cXor2;
double semiFinal = fiveCXor2 / c6;
double final = total * semiFinal;
Console.WriteLine("c = " + (c).ToString());
Console.WriteLine("c ^ 2 = " + (cXor2).ToString());
Console.WriteLine("c * 6 = " + (c6).ToString());
Console.WriteLine("5 * (c ^ 2) = " + (fiveCXor2).ToString());
Console.WriteLine("semi final = " + semiFinal);
Console.WriteLine("final = " + final);
Console.WriteLine("--------------------------------------------");
total = total * (5 * (c ^ 2) / (c * 6));
Console.WriteLine("TOTAL = " + total);
Console.WriteLine("--------------------------------------------");
}
return Math.Round(total);
}
示例结果是:
c = 97
c ^ 2 = 99
c * 6 = 582
5 * (c ^ 2) = 495
semi final = 0.850515463917526
final = 82.5
--------------------------------------------
TOTAL = 0
--------------------------------------------
c = 98
c ^ 2 = 96
c * 6 = 588
5 * (c ^ 2) = 480
semi final = 0.816326530612245
final = 80
--------------------------------------------
TOTAL = 0
--------------------------------------------
正如您所看到的那样,问题是投射
因为 c变量是int ,所以构建过程是:
step 1
[double] = [double] * ([int] * ([int] ^ [int] ) / ([int] * [int] ))
total = total * (5 * (c ^ 2 ) / (c * 6 ));
step 2
[double] = [double] * ([int] * ([int]) / ([int] ))
total = total * (5 * (X) / (Y) );
step 3
[double] = [double] * ([int] * [int]))
total = total * (5 * XdivY );
**CASTING PROBLEM : In this step the XdivY is integer and when the result is 0.1234 the INT result is 0**
step 4
[double] = [double] * ([double]))
total = total * (5mulXdivY );
here c# casting the 5mulXdivY 0 to double but the result is zero
step 5
[double] = [double]
total = 0
答案 2 :(得分:0)
问题在于代码中的这一行
total = total * (5 * (c ^ 2) / (c*6));
c ^ 2
返回的值小于c*6
。现在运算符/
是整数除法,因此smallnumber / largenumber的结果将始终返回零。这将使循环的每次迭代中变量的值总为零。改变这样的代码,它会给你你期望的结果。
private double getTotal(string str)
{
double total = 0;
byte[] asciiBytes = Encoding.ASCII.GetBytes(str);
foreach (int c in asciiBytes)
{
total = total + c;
total = total * (5 * (double)(c ^ 2) / (double)(c * 6));
}
return Math.Round(total);
}
希望它有所帮助。
答案 3 :(得分:-2)
将其添加到其中一个整数
private double getTotal(string str)
{
double total = 0;
byte[] asciiBytes = Encoding.ASCII.GetBytes(str);
foreach (int c in asciiBytes)
{
total = total + c;
total = total * ((double)5 * (c ^ 2) / (c * 6));
}
return Math.Round(total);
}