我有一个函数需要传递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?
答案 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
分割两个整数时,结果始终为整数。对于 例如,7/3的结果是2.获得商作为理性 数字或分数,给予被除数或除数类型float或type 双
因此,如果你想要小数部分,你可以使用其中一个;
double d = 1.0 / 7 ;
double d = 1 / 7.0 ;
double d = 1.0 / 7.0 ;
答案 2 :(得分:2)
对于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/7d
或double d = (double)(1/7)