为什么可以';t I为C#中的浮点变量赋值1.2?我在C和C+中也做了同样的事情+;,它成功了

为什么可以';t I为C#中的浮点变量赋值1.2?我在C和C+中也做了同样的事情+;,它成功了,c#,casting,floating-point,double,C#,Casting,Floating Point,Double,为什么我不能给C#中的浮点变量赋值1.2?我在C和C++中也做了同样的工作, class Program { private readonly int a = 20; private readonly float b; public Program(float tmp) { b = tmp; } static void Main(string[] args) { Program obj1 = n

为什么我不能给C#中的浮点变量赋值1.2?我在C和C++中也做了同样的工作,

class Program
{
    private readonly int a = 20;
    private readonly float b;      

    public Program(float tmp)
    {
        b = tmp;
    }
    static void Main(string[] args)
    {
        Program obj1 = new Program(1.2);
        Console.Read();
    }
}
它给出的误差不能转化为双浮。
为什么1.2浮点值不是这样呢?

1.2
是双精度的(8字节)。
1.2f
是一个
float
(4字节)


除非您通过添加
f
将其标记为
float
,否则代码中包含小数点的任何文字数字都将被解释为
双精度
,而不是
浮点

double不会自动转换为float,因为这会导致精度损失

要修复代码,您可以:

  • 将文字数字标记为浮点数:

    Program obj1=新程序(1.2f)

  • 或者,将其显式转换为浮点:

    Program obj1=新程序((浮点)1.2)


使用数字文字时,应首选前一个选项,但如果要传递类型为double的变量,则可以使用后一个。

精度损失并不比典型的
浮点操作(例如计算1.0f/10.0f)更严重。问题很简单,就是.net遵循Java的向后规则,这要求显式转换从更具体的类型转换为不太具体的类型(尽管每个
double
值都可以在
float
中表示,即使仅表示为一个值,例如“超过2^128”),但是,不需要从特定的类型到更具体的类型(尽管编译器必须任意猜测额外的比特应该是零)。在C和C++中,1.2也是双的。它将被截断为浮动。也许会有一个警告