代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

为什么这些除法方程的结果是零?

  •  8
  • Edward Tanguay  · 技术社区  · 16 年前

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

    297 / 315 = 0.30793650793650793650793650793651
    

    代码:

    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();
            }
        }
    }
    

    答复:

    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();
            }
        }
    }
    
    10 回复  |  直到 16 年前
        1
  •  30
  •   Jon Skeet    16 年前

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

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

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

    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-you表示的精确值 不能 例如,将0.01精确表示为浮点或双精度。字符串格式有效地将结果四舍五入。看我的 article on .NET floating binary point 有关更多信息以及将让您看到 准确的

    我还没费心用100升的 result2 因为结果总是一样的。

        2
  •  11
  •   Lloyd    16 年前

    尝试

    i / 100.0
    
        3
  •  5
  •   dfa    16 年前

    i 是一个 int : i / 100

    i / 100.0 
    
        4
  •  2
  •   Scoregraphic    16 年前

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

    请改用(十进制)i/100.0

        5
  •  1
  •   lotsoffreetime    16 年前

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

        6
  •  1
  •   Tormod    16 年前

    您需要强制执行浮点运算“double/double”,而不是“int/int”

    double result = (double)297 / (double)315 ;
    
        7
  •  0
  •   Ahmed    16 年前

    这是整数除法,不管存储的变量是什么类型,

        8
  •  0
  •   Steve Gilham    16 年前
    double result3 = ((double)i) / 100;
    
        9
  •  0
  •   Matthieu    16 年前

    因为 int 100

        10
  •  0
  •   Yohan Dahmani    9 年前

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