为什么这段代码会返回不同的值? (C#和VB.NET)

时间:2010-12-02 03:13:58

标签: c# vb.net

VB.NET代码:

Module Module1

Sub Main()
    Dim x, y As Single
    x = 0 + (512 / 2 - 407) / 256 * 192 * -1
    y = 0 + (512 / 2 - 474) / 256 * 192
    Console.WriteLine(x.ToString + ": " + y.ToString)
    Console.ReadLine()
End Sub

End Module

返回:113,25:-163,5

C#代码:

class Program
{
    static void Main(string[] args)
    {
        float x, y;
        x = 0 + (512 / 2 - 407) / 256 * 192 * -1;
        y = 0 + (512 / 2 - 474) / 256 * 192;
        Console.WriteLine(x + ": " + y);
        Console.ReadLine();
    }
}

返回0:0

我不明白,会很感激解释。

2 个答案:

答案 0 :(得分:18)

C#/执行整数除法,截断小数部分。 VB.NET隐式转换为Double

要执行浮点除法,请转换为浮点类型:

    static void Main(string[] args)
    {
        float x, y;
        x = 0 + (512 / 2 - 407) / (float)256 * 192 * -1;
        y = 0 + (512 / 2 - 474) / (float)256 * 192;
        Console.WriteLine(x + ": " + y);
        Console.ReadLine();
    }

答案 1 :(得分:9)

0512等C#文字的类型为int。任何int/int(int除以int)都会导致整数除法,这会丢弃任何小数余数,从而导致精度降低。如果使用0F而不是0512F而不是512等浮点文字,那么C#将执行浮点除法,这将保留小数部分。

static void Main(string[] args)
{
    float x, y;
    x = 0F + (512F / 2F - 407F) / 256F * 192F * -1F;
    y = 0F + (512F / 2F - 474F) / 256F * 192F;
    Console.WriteLine(x + ": " + y);
    Console.ReadLine();
}