Comment puis-je diviser deux entiers pour obtenir un double?

282

Comment diviser deux entiers pour obtenir un double?

leora
la source
10
En supposant que cela a été demandé dans une interview - la division entière donne toujours un entier. Vous devez utiliser un type de fonte comme ceux illustrés ci-dessous.
Sesh
2
Différents types de divisions: Entier, Virgule flottante, Décimal discuté dans Pourquoi la division entière en c # renvoie un entier mais pas un flottant?
Michael Freidgeim

Réponses:

460

Vous voulez lancer les chiffres:

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

Remarque: Si l'un des arguments en C # est a double, une doubledivision est utilisée, ce qui donne a double. Donc, ce qui suit fonctionnerait aussi:

double num3 = (double)num1/num2;

Pour plus d'informations, voir:

Dot Net Perls

NoahD
la source
3
Je ne sais pas si c'est la même chose en C #, mais C ne vous demande que de lancer le premier - cela fera automatiquement double / int un double.
paxdiablo
4
@Pax, si l'un des arguments en C ou C # est un double, une double division est utilisée (résultant en un double).
strager
32
Attention à ne pas faire cela: - double num3 = (double)(num1/num2);. Cela vous donnera juste une double représentation du résultat de la division entière!
The Lonely Coder
En supposant que vous n'ayez pas besoin d'une précision supplémentaire, y a-t-il une raison de lancer au doublelieu de float? Je vois que la question se pose doublemais je suis quand même curieux.
Kyle Delaney
@KyleDelaney Juste parce qu'en C # nous utilisons normalement doubleet non float. Lorsque vous écrivez une variable comme var a = 1.0;, ce 1.0 est toujours un double. Je suppose que c'est la principale raison.
this.myself
31

Compléter la réponse de @ NoahD

Pour avoir une plus grande précision, vous pouvez convertir en décimal:

(decimal)100/863
//0.1158748551564310544611819235

Ou:

Decimal.Divide(100, 863)
//0.1158748551564310544611819235

Les doubles sont représentés en allouant 64 bits tandis que la décimale utilise 128

(double)100/863
//0.11587485515643106

Explication approfondie de la "précision"

Pour plus de détails sur la représentation en virgule flottante en binaire et sa précision, consultez cet article de Jon Skeet où il parle floatset doubleset celui-ci où il parle decimals.

fabriciorissetto
la source
2
Faux! doublea une précision de 53 bits, et c'est un format binaire à virgule flottante, alors qu'il decimalest ... décimal, bien sûr, avec 96 bits de précision . Il doubleest donc précis à ~ 15-17 chiffres décimaux et 28-29 chiffres décimaux (et pas deux fois la précision de double). Plus important decimalencore, n'utilise que 102 des 128 bits
phuclv
Merci @phuclv, corrigé cela. Je voulais dire "allocation d'espace". Vous aviez raison de la précision de decimals(96), mais doublesa 52 bits de mantisse , et non 53.
fabriciorissetto
1
oui, la mantisse a 52 bits, mais il y a toujours un bit caché, ce qui donne une signification de 53 bits. S'agit-il de 52 ou 53 bits de précision en virgule flottante?
phuclv
Decimal.Divide était super! Thx
Ricardo G Saraiva
10

transformez les entiers en doubles.

Stephen Wrighton
la source
Pour être précis, vous pouvez convertir un entier en double comme ceci: (double) myIntegerValue
Whiplash
5

Convertissez l'un d'eux en double d'abord. Ce formulaire fonctionne dans de nombreuses langues:

 real_result = (int_numerator + 0.0) / int_denominator
Mark Ransom
la source
1
Plus facile à faire ...var result = 1.0 * a / b;
Basic
@Basic, il y a 100 façons de le faire. Je préfère l'ajout juste parce qu'il est plus rapide, bien que le casting soit évidemment encore plus rapide.
Mark Ransom
1
var firstNumber=5000,
secondeNumber=37;

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

Console.WriteLine(decimalResult );
Rejwanul Reja
la source
1
La question semble appeler doubleet non decimal.
Kyle Delaney