Jak mogę podzielić dwie liczby całkowite, aby uzyskać podwójny?


282

Jak podzielić dwie liczby całkowite, aby uzyskać podwójny?


10
Zakładając, że zapytano o to w wywiadzie - dzielenie liczb całkowitych zawsze skutkuje liczbą całkowitą. Musisz użyć rzutowania typu takiego jak pokazano poniżej.
Sesh,

2
Różne typy podziałów: liczba całkowita, zmiennoprzecinkowy, dziesiętny - omówione w Dlaczego podział całkowity w c # zwraca liczbę całkowitą, ale nie zmiennoprzecinkową?
Michael Freidgeim

Odpowiedzi:


460

Chcesz rzucić liczby:

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

Uwaga: Jeśli którykolwiek z argumentów w języku C # jest a double, doubleużywany jest podział, który daje w wyniku double. Więc działałyby również:

double num3 = (double)num1/num2;

Aby uzyskać więcej informacji zobacz:

Dot Net Perls


3
Nie wiem, czy jest tak samo w C #, ale C wymaga tylko pierwszego rzutu - automatycznie zrobi double / int podwójnym.
paxdiablo

4
@Pax, Jeśli którykolwiek z argumentów w C lub C # jest podwójny, stosowany jest podwójny podział (w wyniku podwójny).
strager

32
Uważaj, aby tego nie zrobić: - double num3 = (double)(num1/num2);. To da ci podwójną reprezentację wyniku podziału liczb całkowitych!
The Lonely Coder,

Zakładając, że nie potrzebujesz dodatkowej precyzji, czy jest powód, aby rzucić na nią doublezamiast float? Widzę pytania wymagające, doubleale i tak jestem ciekawy.
Kyle Delaney

@KyleDelaney Po prostu dlatego, że w C # zwykle używamy, doublea nie float. Kiedy piszesz zmienną taką jak var a = 1.0;ta, 1.0 zawsze jest double. To chyba główny powód.
this.myself

31

Uzupełnienie odpowiedzi @ NoahD

Aby mieć większą precyzję, możesz rzutować na dziesiętne:

(decimal)100/863
//0.1158748551564310544611819235

Lub:

Decimal.Divide(100, 863)
//0.1158748551564310544611819235

Przedstawione są podwójne przydzielające 64 bity, podczas gdy dziesiętne używa 128

(double)100/863
//0.11587485515643106

Dogłębne wyjaśnienie „precyzji”

Aby uzyskać więcej informacji na temat reprezentacji zmiennoprzecinkowej na binarny i jego precyzji przyjrzeć tym artykule od Jon Skeet gdzie mówi o floatsi doublesa ten jeden , gdzie mówi o decimals.


2
Źle! doublema precyzję 53 bitów i jest to binarny format zmiennoprzecinkowy, podczas gdy decimaljest ... dziesiętny, oczywiście z 96 bitami precyzji . doubleJest więc dokładny do ~ 15-17 cyfr dziesiętnych i 28-29 cyfr dziesiętnych (i nie dwukrotnie więcej niż precyzja double). Co ważniejsze, decimalfaktycznie używa tylko 102 ze 128 bitów
phuclv

Dzięki @phuclv, naprawiłem to. Miałem na myśli „przydział miejsca”. Miałeś rację co do precyzji decimals(96), ale doublesma 52 bity mantysy , a nie 53.
fabriciorissetto

1
tak, mantysa ma 52 bity, ale wciąż jest ukryty bit, co daje 53-bitowe znaczenie. Czy to 52 lub 53 bity precyzji zmiennoprzecinkowej?
phuclv

Dziesiętny.Divide był świetny! Thx
Ricardo G Saraiva

10

rzuć liczby całkowite do liczby podwójnej.


Aby być konkretnym, możesz rzucić liczbę całkowitą na podwójną, tak jak: (double) myIntegerValue
Whiplash

5

Przekształć jeden z nich w podwójny. Ten formularz działa w wielu językach:

 real_result = (int_numerator + 0.0) / int_denominator

1
Łatwiej to zrobić ...var result = 1.0 * a / b;
Podstawowy

@Basic jest 100 sposobów na zrobienie tego. Wolę dodawanie tylko dlatego, że jest szybsze, chociaż casting jest oczywiście szybszy.
Mark Ransom,

1
var firstNumber=5000,
secondeNumber=37;

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

Console.WriteLine(decimalResult );

1
Pytanie wydaje się wymagać, doublea nie decimal.
Kyle Delaney
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.