C#为什么要将双精度转换为整数?

C#为什么要将双精度转换为整数?,c#,double,truncate,C#,Double,Truncate,我有一个函数,需要在其中传递一个双精度。要调用该函数,我使用以下代码:- static int Main() { double d = 1/7 ; Console.WriteLine("The value of d is {0}", d) ; calc(d) ; return 0 ; } 以下程序的输出为 d的值是0 为什么会这样,为什么C#在小数点之前截断部分,尽管在双精度中存储了1/7?一个int除以一个int使用整数截断 使用: 将分子或分

我有一个函数,需要在其中传递一个
双精度
。要调用该函数,我使用以下代码:-

static int Main()
{
     double d = 1/7 ; 
     Console.WriteLine("The value of d is {0}", d) ; 
     calc(d) ; 
     return 0 ; 
}
以下程序的输出为

d的值是0


为什么会这样,为什么C#在小数点之前截断部分,尽管在双精度中存储了1/7?

一个
int
除以一个
int
使用整数截断

使用:

将分子或分母(或两者)提升为浮点类型会将除法结果提升为浮点类型

参考文献:


  • 一个
    int
    除以一个
    int
    使用整数截断

    使用:

    将分子或分母(或两者)提升为浮点类型会将除法结果提升为浮点类型

    参考文献:


      • 因为1/7中的第一个参数是整数,所以c#进行整数除法

        如果键入以下内容,将得到正确的结果:

        double d = (double)1/7;
        

        因为1/7中的第一个参数是整数,所以c#进行整数除法

        如果键入以下内容,将得到正确的结果:

        double d = (double)1/7;
        

        如果将数字指定为不带小数点的
        1
        ,则假定为
        int
        类型。更换线路

        double d = 1/7 ;
        

        或者,您可以使用后缀将类型指定为
        double

        double d = 1d/7 ;
        

        如果将数字指定为不带小数点的
        1
        ,则假定为
        int
        类型。更换线路

        double d = 1/7 ;
        

        或者,您可以使用后缀将类型指定为
        double

        double d = 1d/7 ;
        
        在C#和Java(以及大多数编程语言)中,结果的类型是分子和分母的类型。如果希望结果是双精度的,则必须将构成分子和分母的整数转换为双精度

        在C#和Java(以及大多数编程语言)中,尝试使用
        double d=1d/7d
        double d=(double)(1/7)
        ,结果的类型是分子和分母的类型。如果希望结果是双精度的,则必须将构成分子和分母的整数转换为双精度


        请尝试
        double d=1d/7d
        double d=(double)(1/7)

        这里提供的是操作优先级。 实际上你已经写了

        int temp = 1 / 7;
        double d = temp;
        
        它实际上被编译成

        int temp = 0;
        double d = temp;
        

        原因是您正在使用int divide运算符

        static operator int / (int, int)
        
        当你打算使用

        static operator double /(double, double)
        
        你可以通过写作来强迫它

        double d = 1.0 / 7;
        


        etc etc

        这里的是操作优先级。 实际上你已经写了

        int temp = 1 / 7;
        double d = temp;
        
        它实际上被编译成

        int temp = 0;
        double d = temp;
        

        原因是您正在使用int divide运算符

        static operator int / (int, int)
        
        当你打算使用

        static operator double /(double, double)
        
        你可以通过写作来强迫它

        double d = 1.0 / 7;
        


        等等,等等,因为你在这里做的事叫做。它总是丢弃小数部分。这就是为什么
        1/7
        总是给你
        0
        结果不管你分配的是哪种类型。

        NET有3种类型的分区

        • 整数除法
        • 浮点除法
        • 十进制除法
        也来自

        当您除以两个整数时,结果总是一个整数。对于 例如,7/3的结果是2。作为有理数求商 数字或分数,给出被除数或除数类型float或type 加倍

        因此,如果你想要分数部分,你可以使用其中的一个

        double d = 1.0 / 7 ;
        double d = 1 / 7.0 ;
        double d = 1.0 / 7.0 ;
        

        因为你在这里做的事叫做。它总是丢弃小数部分。这就是为什么
        1/7
        总是给你
        0
        结果不管你分配的是哪种类型。

        NET有3种类型的分区

        • 整数除法
        • 浮点除法
        • 十进制除法
        也来自

        当您除以两个整数时,结果总是一个整数。对于 例如,7/3的结果是2。作为有理数求商 数字或分数,给出被除数或除数类型float或type 加倍

        因此,如果你想要分数部分,你可以使用其中的一个

        double d = 1.0 / 7 ;
        double d = 1 / 7.0 ;
        double d = 1.0 / 7.0 ;
        

        对于形式为x/y的操作,二进制运算符重载 分辨率(第7.2.4节)用于选择特定操作员 实施操作数转换为的参数类型 所选运算符,结果类型为返回类型 接线员的名字

        这意味着运算符/根据其参数选择正确的重载。在您的情况下,您的参数是整数,因此,运算符选择返回整数的整数除法(截断余数)

        为了避免这种情况并选择浮点除法,您应该给出一个提示,强制其中一个常量为double/float

        double d = 1.0 / 7 ; 
        

        对于形式为x/y的操作,二进制运算符重载 分辨率(第7.2.4节)用于选择特定操作员 实施操作数转换为的参数类型 所选运算符,结果类型为返回类型 接线员的名字

        这意味着运算符/根据其参数选择正确的重载。在您的情况下,您的参数是整数,因此,运算符选择返回整数的整数除法(截断余数)

        为了避免这种情况并选择浮点除法,您应该给出一个提示,强制其中一个常量为double/float

        double d = 1.0 / 7 ; 
        
        C#在编译时是静态类型的。您的代码(双d=1/7;)在运行时以以下方式运行

        var temp = 1/7;
        double d = temp;
        
        这里,1和7是整数。因此,除法运算只返回整数并将其存储在临时位置。然后,创建变量d,并将临时值存储在该变量中。这里是隐式类型转换w