2010-09-30 12 views
5

Jak mogę sprawdzić, czy 204/5 jest większe niż 200/5? Doświadczyłem trudności, gdy próbowałem tego, używając zarówno matematyki zmiennoprzecinkowej, jak i dziesiętnej.Problemy z dzieleniem w C#

+0

(rzeczywista) 200/(rzeczywista) 5 <(rzeczywista) 204/(rzeczywista) 5 – FFox

Odpowiedz

5

dołączenie .0 lub f do dowolnej liczby zmusza język zinterpretować tę liczbę jako zmiennoprzecinkowej przecinku:

  • 204 jest liczbą całkowitą,

  • 204f jest pojedynczej precyzji zmiennoprzecinkową po przecinku i

  • 204.0 jest podwójnej precyzji zmiennoprzecinkową dziesiętny.

Dlatego 204/5 zwraca liczbę całkowitą 40 i 204.0/5 Zwraca podwójnej precyzji pływak 40.8.

if (204.0/5 > 200.0/5) { 
    // stuff 
} 

Lub, można podjąć matematycznie prostszą trasę:

if (204 > 200) { 
    // because you're dividing both of them by 5 
} 
+0

CPU nie przekształcone. Po prostu mówi kompilatorowi, jaki rodzaj kodu jest ogólny, aby poradzić sobie z liczbami (jako liczby całkowite, zmienne, podwójne itd.). – siride

+0

@side - Absolutnie racja. Edytowane. – amphetamachine

0
if ((204.0/5.0) > (200.0/5.0)) { 
    //do stuff! 
} 
15

Korzystanie pływaka lub dziesiętną będzie pracy ... ale trzeba wykonać arytmetyczną pływających punkt, tworząc co najmniej jeden z operandów dziesiętny/zmienny/podwójny:

decimal x = ((decimal) 204)/5; 
decimal y = ((decimal) 200)/5; 

if (x > y) // Yes! 

lub użyć pływające literały punktowe:

decimal x = 204m/5; 
decimal y = 200m/5; 

to nie ma znaczenia który argument jest zmiennoprzecinkowych:

decimal x = 204/5m; 
decimal y = 200/5m; 

pływaka/podwójne działać tak samo dobrze:

double x = 204d/5; 
double y = 200d/5; 

Co się dzieje, jeśli używasz tylko 204/5? Rozważmy to stwierdzenie:

double x = 204/5; 

Kompilator nie używa typu zmiennej do określenia typu prawej strony. Wynika z tego, że prawa strona to tylko liczba całkowita, uzyskana przez podzielenie dwóch liczb całkowitych. Wynik jest następnie przekształcany na double i przypisywany do x. Problem polega na tym, że arytmetyka jest wykonywana tylko z liczbami całkowitymi, podczas gdy chcesz, aby konwersja na punkt zmiennoprzecinkowy była wykonywana wcześniej, abyś mógł otrzymać wynik zmiennoprzecinkowy.

0

Powodem jest, że przy próbie obliczenia 204/5, to jest dokładnie obliczanie int 204 divides int 5, wynik jest również int w języku C#. Możesz spróbować 204m/5, otrzymasz poprawną odpowiedź.

0
if (((float)(204)/5) > ((float)(200)/5)) 
{ 
//Enter code here 
} 
else 
{ 
//Enter code here 
}