2013-07-04 10 views
13

Widziałem ten finanse kod obliczeniowy na komputerze mojego przyjaciela:0.0/0.0 w C# nie rzuci "Próbowano podzielić przez zero."?

double Total = ... 
double Paid = ... 
double Wating_For_Details = ... 
double Decuctibles = ... 
double Rejected = ... 

dobrze, moment Widziałem to, powiedziałem mu, że double jest reprezentowany na base 2 i może NIE stanowią obliczenia finansowego. zamiast tego użyj decimal.

świetnie.

Ale w chwili zmienić to podwojenie Ive napotkał:

Attempted to divide by zero.

co?

Najwyraźniej - używając double, gdy dzieląc z 0.0 robi NIE rzuca wyjątek:

enter image description here

Ale zwraca NAN.

Podczas mojego kodu (przy użyciu decimal) wykonuje rzut wyjątku (gdy Total jest zero)

A więc pytam:

Sprawdziłem 0.0==0 i zwraca true. więc dlaczego nie otrzymuję wyjątku, ale NAN? Wiem, jak to powinno być, ale gdzie jest powszechny powód nie rzucania wyjątku przy dzieleniu podwójnego przez zero?

+3

"Sprawdziłem" 0.0 == 0 "" - co, według Ciebie, sprawdzało? Operandy po obu stronach są nierównych typów, ale niejawna konwersja 'int' na' double' istnieje - więc to co faktycznie sprawdziłeś, to że '0.0 == 0.0'. –

+0

Również twoje pytanie jest postawione tak, jakby rzucanie wyjątku było * oczywiście * poprawną rzeczą w tej sytuacji - jest wiele kompromisów w świecie komputerów i często nie ma jednego "poprawnego" sposobu robienia rzeczy. –

+0

Podobny do http://stackoverflow.com/questions/4609698/inconsistency-in-divide-by-zero-behavior-between-different-value- typeses (nawet jeśli nie jest dokładnie duplikatem) – bigge

Odpowiedz

5

SEE http://msdn.microsoft.com/en-us/library/system.double.nan.aspx

sposobu lub operator zwraca NaN gdy wynik operacji jest nieokreślona. Na przykład wynikiem dzielenia liczby zerowej przez zero jest NaN, jak pokazuje poniższy przykład. (...) Ponadto wywołanie metody z wartością NaN lub operacją na wartości NaN zwraca NaN, jak pokazuje poniższy przykład.

poniższym przykładzie ilustruje zastosowanie NaN:

Double zero = 0; 

    // This condition will return false. 
    if ((0/zero) == Double.NaN) 
    Console.WriteLine("0/0 can be tested with Double.NaN."); 
    else 
    Console.WriteLine("0/0 cannot be tested with Double.NaN; use Double.IsNaN() instead."); 
16

W przeciwieństwie do operacji z wbudowanymi typami, które generują wyjątki w przypadkach przepełnienia lub nielegalnych działań, takich jak dzielenie przez zero, operacje o wartościach zmiennoprzecinkowych nie rzucać wyjątki. Zamiast tego, w wyjątkowych sytuacjach, wynik operacji zmiennoprzecinkowej jest zero dodatnie nieskończoność, negatywne nieskończoność, albo nie jest liczbą (NaN):

From Double on MSDN.

0

To documented:

sposobu lub operator zwraca NaN gdy wynik operacji jest nieokreślona. Na przykład wynikiem dzielenia zera na zero jest NaN.

2

Istnieją pewne specjalne działanie podwójnego po podzieleniu przez zero (0,0)

d/0.0 => Double.NaN if d==0.0 
d/0.0 => Double.PositiveInfinity if d>0.0 
d/0.0 => Double.NegativeInfinity if d<0.0 

DivideByZeroException jest generowany tylko do Integer (który jest dziesiętny!)

Powiązane problemy