关于c#:为什么这些除法方程导致零?

Why do these division equations result in zero?

下面for循环中所有的除法方程的结果都是0。我怎样才能让它给我一个小数,例如:

1
297 / 315 = 0.30793650793650793650793650793651

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;

namespace TestDivide
{
    class Program
    {
        static void Main(string[] args)
        {

            for (int i = 0; i <= 100; i++)
            {
                decimal result = i / 100;
                long result2 = i / 100;
                double result3 = i / 100;
                float result4 = i / 100;
                Console.WriteLine("{0}/{1}={2} ({3},{4},{5}, {6})", i, 100, i / 100, result, result2, result3, result4);
            }
            Console.ReadLine();
        }
    }
}

答:

谢谢乔恩和所有人,这就是我想做的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;

namespace TestDivide
{
    class Program
    {
        static void Main(string[] args)
        {
            int maximum = 300;

            for (int i = 0; i <= maximum; i++)
            {
                float percentage = (i / (float)maximum) * 100f;
                Console.WriteLine("on #{0}, {1:#}% finished.", i, percentage);
            }
            Console.ReadLine();
        }
    }
}


您使用的是int/int,它在整数算术中执行所有操作,即使您要分配给一个十进制/双精度/浮点变量。

强制其中一个操作数为要用于算术的类型。

1
2
3
4
5
6
7
8
9
for (int i = 0; i <= 100; i++)
{
    decimal result = i / 100m;
    long result2 = i / 100;
    double result3 = i / 100d;
    float result4 = i / 100f;
    Console.WriteLine("{0}/{1}={2} ({3},{4},{5}, {6})",
                      i, 100, i / 100d, result, result2, result3, result4);
}

结果:

1
2
3
4
5
6
0/100=0 (0,0,0, 0)
1/100=0.01 (0.01,0,0.01, 0.01)
2/100=0.02 (0.02,0,0.02, 0.02)
3/100=0.03 (0.03,0,0.03, 0.03)
4/100=0.04 (0.04,0,0.04, 0.04)
5/100=0.05 (0.05,0,0.05, 0.05)

(等)

请注意,这并没有显示由float或double表示的确切值-例如,您不能准确地表示0.01作为float或double。字符串格式有效地将结果四舍五入。有关更多信息,请参阅我在.NET浮动二进制点上的文章,以及一个类,它将让您看到double的确切值。

我没有费心为result2使用100L,因为结果总是一样的。


尝试

1
i / 100.0


因为i是int:i / 100执行整数除法,所以结果(始终为0)被强制转换为目标类型。您需要在表达式中指定至少一个非int文本:

1
i / 100.0

因为我是一个整数,100是一个整数,所以你有一个整数除法。

改为尝试(十进制)i/100.0


您需要强制浮点运算"double/double"而不是"int/int"

1
double result = (double)297 / (double)315 ;

无论您将其存储在何处,一个整数除以一个整数都将始终是一个整数。


在我的例子中,我只有vars,没有int

1
float div = (var1 - var2) / float.Parse(var1.ToString());

1
double result3 = ((double)i) / 100;

这是整数除法,无论您存储的变量类型是什么,所以int/int=int


因为我是一个int值,你除以一个整数,结果就是一个整数!所以您需要除以100.0才能有一个隐式的浮点强制转换,或者指定100f或100d。