为什么C#转换为int?

时间:2014-01-27 08:44:57

标签: c# double truncate

我有一个函数需要传递double。要调用该函数,我使用以下代码: -

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?

8 个答案:

答案 0 :(得分:11)

int除以int使用整数截断。

使用:

static int Main()
{
    double d = 1.0 / 7 ; 
             //^^   or d = 1.0 / 7.0 
    Console.WriteLine("The value of d is {0}", d) ; 
    calc(d) ; 
    return 0 ; 
}

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

参考文献:

答案 1 :(得分:4)

因为您所做的就是 integer division 。它总是丢弃小数部分。这就是1 / 7始终为您提供0 的原因,无论您指定哪种类型。

.NET有3种类型的划分。 From 7.7.2 Division operator

  • 整数分部
  • 浮点划分
  • 十进制分割

同样来自/ Operator (C# Reference)

  

分割两个整数时,结果始终为整数。对于   例如,7/3的结果是2.获得商作为理性   数字或分数,给予被除数或除数类型float或type   双

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

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

答案 2 :(得分:2)

According to C# reference

  

对于x / y形式的运算,二元运算符重载   分辨率(第7.2.4节)适用于选择特定的运算符   实现。操作数转换为参数类型   选定的运算符,结果的类型是返回类型   运营商。

这意味着操作员/选择正确的过载来查看其参数。在您的情况下,您的参数是整数,因此,运算符选择返回整数的整数除法(截断余数)

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

double d = 1.0 / 7 ; 

答案 3 :(得分:1)

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

如果输入:

,您将获得正确的结果
double d = (double)1/7;

答案 4 :(得分:1)

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

int temp = 1 / 7;
double d = temp;

实际上编译为

int temp = 0;
double d = temp;

double d = 0;

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

static operator int / (int, int)

当你打算使用

static operator double /(double, double)

您可以通过编写

来强制执行此操作
double d = 1.0 / 7;

OR

double d = 1d / 7d;

等等

答案 5 :(得分:1)

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

var temp = 1/7;
double d = temp;

这里,1和7是整数。因此,除法运算仅返回整数并将其存储在临时位置。之后,创建变量d,并将临时值存储在该变量中。所以,这里隐式类型转换不起作用。

因此,您必须在分割时完成显式类型转换。 1.0 / 7或1 / 7.0或(双)1/7或1 /(双)7将返回双精度值。因此,此隐式强制转换的整数将不适用于此,您将获得所需的结果。

答案 6 :(得分:0)

如果您将号码指定为1而没有小数点,则假定为int类型。替换

double d = 1/7 ;

double d = 1.0/7 ;

或者,您可以使用后缀

将类型指定为double
double d = 1d/7 ;

答案 7 :(得分:0)

在C#和Java(以及大多数编程语言)中,结果的类型是分子和分母的类型。如果你想让结果成为双精度,你必须将构成分子和分母的整数转换为双精度。

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