C# 两者之间的区别:除以双变量| | | | |除以带小数点的整数变量(例如1/2.00)| | | |在公式中加上(双精度)

C# 两者之间的区别:除以双变量| | | | |除以带小数点的整数变量(例如1/2.00)| | | |在公式中加上(双精度),c#,C#,以下备选方案之间有什么区别吗 在这个简单的循环中,结果之间似乎没有任何差异,但我想知道在某些情况下,不同的方法是否会导致结果差异。 我想知道这些方法是完全相同的还是有一些细微的差别 x是双倍的: double x = 2; double sum = 0; while (true) { sum += 1 / ((x - 1) * 2); x++; } x为int,

以下备选方案之间有什么区别吗

在这个简单的循环中,结果之间似乎没有任何差异,但我想知道在某些情况下,不同的方法是否会导致结果差异。 我想知道这些方法是完全相同的还是有一些细微的差别

x是双倍的:

        double x = 2; 
        double sum = 0;

        while (true)
        {
            sum += 1 / ((x - 1) * 2);
            x++;

        }
x为int,但在公式中2之前为双精度:

        int x = 2; 
        double sum = 0;

        while (true)
        {
            sum += 1 / ((x - 1) * (double)2);
            x++;

        }
x为int,但2写为十进制:

        int x = 2;
        double sum = 0;

        while (true)
        {
            sum += 1 / ((x - 1) * 2.00);
            x++;

        }

评论中的结果及其类型:

        var a = 2;   //int
        var b = 2.0; //double
        var c = 2d;  //double
        var d = 2f;  //float (alias of System.Single)
        var e = 2m;  //decimal
        var f = 2l;  //long
        var g = 2ul; //ulong
        var h = 2.0m; //decimal
        var i = 2.0f; //float

        var t = 1 / 2.0; //double
        var u = 1 / 2; //int!
        var v = 1 / ((6 - 1) * 2); //int!
        var w = 1 / 2 + 6 / 2.0 //int + double = 0 + 3 = 4
看看你的样品:

由于double参与所有公式,结果将是double,它与sum类型匹配,并将根据类型正确计算 您明确地将int转换为double-look 1 2.00是双视1 所以,所有样本都将以相同的方式计算总和


除了int-type将在无限循环的早期溢出之外,没有区别*-您被困在一个无止境的while循环中,无法摆脱它


*离开循环的唯一方法是通过异常。。。如果x++和x的类型为double…

则double溢出需要更长的时间。您可以尝试比较每个块生成的CIL,并查看差异。另外,您可能想尝试使用非常大和非常小的数字。让我们假设抖动在不同的情况下做了不同的事情,您将如何处理这些信息?