如何将两个整数相除得到一个浮点数?

372

如何将两个整数相除得到一个双精度浮点数?


11
假设这是面试中的问题 - 整数除法总是得到整数。你必须使用像下面展示的类型转换。 - Sesh
2
不同类型的除法:整数、浮点数、小数——在为什么C#中的整数除法返回整数而不是浮点数?中讨论。 - Michael Freidgeim
9个回答

573
你想要进行数字转换:
double num3 = (double)num1/(double)num2;

注意: 如果在C#中的任何参数是double,将使用double除法,其结果为double。因此,下面的代码也可以工作:

<code><code>double num3 = (double)num1/num2;
</code></code>

更多信息请参见:

Dot Net Perls


5
不确定C#是否相同,但在C中只需要强制转换第一个参数,它会自动将double/int转换为double。 - paxdiablo
4
如果在C或C#中的任何参数是double类型,则会使用双精度除法(得到的结果是double类型)。 - strager
52
注意不要这样做:double num3 = (double)(num1/num2);。这只会给你一个整数除法结果的双精度浮点数表示! - The Lonely Coder
假设您不需要额外的精度,那么将类型转换为double而不是float是否有理由?我可以看到问题要求使用double,但无论如何我都很好奇。 - Kyle Delaney
1
@KyleDelaney 因为在C#中我们通常使用double而不是float。当你像这样写一个变量var a = 1.0;时,这个1.0总是一个double。我想这就是主要原因。 - this.myself
1
是的,在VB中,1/2等于1。(真是糟糕!)Cdec(1) / Cdec(2) = 0.5。 - Rob

48

在补充@NoahD的答案时

为了更精确,您可以转换为十进制:

(decimal)100/863
//0.1158748551564310544611819235
或者:
Decimal.Divide(100, 863)
//0.1158748551564310544611819235

双精度浮点数使用64位进行分配,而十进制数则使用128位。

(double)100/863
//0.11587485515643106

“精度”详解

有关二进制浮点表示及其精度的更多详细信息,请参阅Jon Skeet的此篇文章,其中他谈到了floatsdoubles,以及这篇文章,他在其中讨论了decimals


2
错误!double 的精度为 53 位,它是一种二进制浮点格式,而 decimal 是一种……当然是十进制的,具有 96 位精度。因此,double 精确到约 15-17 个小数位,而 decimal 精确到 28-29 个小数位(并不是 double 的两倍精度)。更重要的是,decimal 实际上只使用了 128 位中的 102 位。 - phuclv
感谢@phuclv,已经修复了。我是指“空间分配”。你对decimals(96)的精度是正确的,但是doubles只有52位尾数,而不是53位。 - fabriciorissetto
1
是的,尾数有52位,但仍有一个隐藏位,因此得到了53位的有效数字。[浮点精度是52位还是53位?](https://dev59.com/KnbZa4cB1Zd3GeqPBAvJ) - phuclv
Decimal.Divide很棒!谢谢 - Ricardo G Saraiva

10

将整数转换为双精度浮点数。


具体而言,您可以像这样将整数转换为双精度:(double)myIntegerValue - Whiplash

9

首先将其中一个转换为double类型。这种形式在许多语言中都适用:

 real_result = (int_numerator + 0.0) / int_denominator

2
更容易的方法是这样做... var result = 1.0 * a / b; - Basic
1
@基本上有100种方法可以做到这一点。我更喜欢加法,因为它更快,尽管强制转换显然仍然更快。 - Mark Ransom

4
var result = decimal.ToDouble(decimal.Divide(5, 2));

5 = 第一个数字,2 = 第二个数字 - Frank
2
您可以编辑您的帖子以添加信息。请不要在评论中添加信息。 - Suraj Rao

4
var firstNumber=5000,
secondeNumber=37;

var decimalResult = decimal.Divide(firstNumber,secondeNumber);

Console.WriteLine(decimalResult );

1
这个问题似乎需要使用 double 而不是 decimal - Kyle Delaney

0

我已经阅读了大部分的答案,我非常确定这是不可行的。无论你尝试将两个整数除以双精度或浮点数都不会发生。 但是你有很多方法可以使计算发生,只需在计算之前将它们转换为浮点数或双精度即可。


1
你好并欢迎来到SO!请阅读tour如何撰写一篇好的答案?。请确保在您的答案中包含新信息(而不是其他答案中已有的信息)。 - Tomer Shetah

0
最简单的方法是将小数点加到您的整数中。

Ex.:

var v1 = 1 / 30 //the result is 0
var v2 = 1.00 / 30.00 //the result is 0.033333333333333333

0
被接受的答案的评论中,提出了一个值得在单独的答案中强调的区别。
正确的代码:
double num3 = (double)num1/(double)num2;

不同于强制转换整数除法的结果:

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

假设num1 = 7,num2 = 12:

正确的代码将导致num3 = 0.5833333

将整数除法的结果强制转换将导致num3 = 0.00


1
好的,明白了。已经在评论中添加了链接。 - Bidder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接