私人双人总是返回0

时间:2017-05-17 18:54:22

标签: c#

我有这个功能:

{{1}}

这用于获取字符串ASCII值的总数,但在此过程中进行一些数学运算而不仅仅是添加。我需要这个来返回总数,但是当前正在返回0.如何让它返回正确的值? (PS:它需要返回一个整数,但是这可以是double的数据类型,以便以后转换。基本上只需要它返回一个整数。)(PSPS:我不知道字符串是什么,它取决于最终用户)

_

4 个答案:

答案 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);
        }