如何将两个整数相除以获得双精度?


Answers:


460

您要转换数字:

double num3 = (double)num1/(double)num2;

注意:如果C#中的任何参数为a doubledouble则使用除法得到a double。因此,以下内容也可以工作:

double num3 = (double)num1/num2;

有关更多信息,请参见:

点网Perls


3
不知道在C#中是否相同,但是C仅要求您强制转换第一个-它会自动使double / int为double。
paxdiablo

4
@Pax,如果C或C#中的任何arg是双精度型,则使用双精度除法(导致双精度)。
斯特拉格2009年

32
注意不要这样做:- double num3 = (double)(num1/num2);。这只会给您整数除法结果的双重表示!
孤独的编码者2014年

假设您不需要额外的精度,是否有理由要double代替float?我可以看到问题的征兆,double但我还是很好奇。
凯尔·德莱尼

@KyleDelaney只是因为在C#中我们通常使用double而不是float。当您像这样编写变量时var a = 1.0;,此1.0始终是double。我想这是主要原因。
this.myself

31

补充@NoahD的答案

要提高精度,可以将其转换为十进制:

(decimal)100/863
//0.1158748551564310544611819235

要么:

Decimal.Divide(100, 863)
//0.1158748551564310544611819235

双精度表示分配64位,而十进制表示128

(double)100/863
//0.11587485515643106

深入解释“精度”

有关二进制浮点表示,精度更多的细节来看看这篇文章从乔恩斯基特,他谈到floatsdoubles这一个地方他谈到decimals


2
错误!double具有53位的精度,并且是二进制浮点格式,而decimal十进制的当然是96位的精度。因此double精确到〜15-17个十进制数字和十进制28-29个数字(而不是的精度的两倍double)。更重要的decimal是,实际上仅使用了128位中的102位
phuclv

谢谢@phuclv,将其修复。我的意思是“空间分配”。你是对的精度decimals(96),但doubles具有尾数的52位,而不是53
fabriciorissetto

1
是的,尾数有52位,但是还有一个隐藏位,导致有效位为53位。是52位还是53位浮点精度?
phuclv

Decimal.Divide很棒!Thx
Ricardo G Saraiva


5

首先将其中之一转换为双精度。该表格可以使用多种语言:

 real_result = (int_numerator + 0.0) / int_denominator

1
更容易做...var result = 1.0 * a / b;
基本的

@Basic有100种方法。我更喜欢添加,只是因为它更快,尽管投射显然仍然更快。
Mark Ransom

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.