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种类型的分区
- 整数除法
- 浮点除法
- 十进制除法
double d = 1.0 / 7 ;
double d = 1 / 7.0 ;
double d = 1.0 / 7.0 ;
因为你在这里做的事叫做。它总是丢弃小数部分。这就是为什么
1/7
总是给你0
结果不管你分配的是哪种类型。
NET有3种类型的分区
- 整数除法
- 浮点除法
- 十进制除法
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