2013-07-04 1 views
13

ich diese Finanz Berechnung Code gesehen habe am Computer meines Freundes:0.0/0.0 in C# wird nicht geworfen "Versuch, durch Null zu teilen."?

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

Nun, den Moment, als ich das sah, sagte ich ihm, dass double bei base 2 vertreten und kann NICHT Finanzberechnung darstellen. Verwenden Sie stattdessen decimal.

groß.

Aber der Moment, als ich es ändern Ive zu verdoppeln begegnet:

Attempted to divide by zero.

HUH?

Offenbar - mit double, wenn sie mit 0.0 Dividieren es tut NICHT Ausnahme auslöst:

enter image description here

Aber kehrt NAN.

Während mein Code (mit decimal) wirft Ausnahme

(wenn Totalzero ist) Und so frage ich:

I 0.0==0 geprüft und es gibt true zurück. also warum bekomme ich keine Ausnahme aber NAN? Ich weiß, wie es sein sollte, aber wo ist der allgemeine Sinn, keine Ausnahme zu werfen, wenn man doppelt durch Null teilt?

+3

"Ich überprüfte' 0.0 == 0' "- was denkst du, dass tatsächlich überprüft? Die Operanden auf beiden Seiten haben ungleiche Typen, aber es gibt eine implizite Umwandlung von "int" zu "double" - was Sie also überprüft haben, war "0,0 == 0.0". –

+0

Auch Ihre Frage ist so gestellt, als ob das Auslösen einer Ausnahme * offensichtlich * das Richtige in dieser Situation ist - es gibt viele Kompromisse in der Computerwelt und oft keinen einzigen "richtigen" Weg, Dinge zu tun. –

+0

Ähnlich wie http://stackoverflow.com/questions/4609698/inconsistency-in-divide-by-zero-behavior-between-different-value-types (obwohl nicht genau dupliziert) – bigge

Antwort

5

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

Verfahren oder Betreiber sehen den Wert NaN zurück, wenn das Ergebnis einer Operation nicht definiert ist. Zum Beispiel ist das Ergebnis der Division von Null durch Null NaN, wie das folgende Beispiel zeigt. (...) Darüber hinaus gibt ein Methodenaufruf mit einem NaN-Wert oder einer Operation mit einem NaN-Wert NaN zurück, wie das folgende Beispiel zeigt.

Im folgenden Codebeispiel veranschaulicht die Verwendung von 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

Im Gegensatz zu Operationen mit integrierten Typen, die von Null Ausnahmen in Fällen von Überlauf oder illegaler Operationen wie Division werfen, Operationen mit Gleitkommazahlen nicht Ausnahmen werfen. Stattdessen in Ausnahmesituationen, das Ergebnis einer Gleitkomma-Operation ist null, positive Unendlichkeit, negative Unendlichkeit oder keine Zahl (NaN):

From Double on MSDN.

0

Das heißt documented:

Verfahren oder Betreiber NaN zurückgibt, wenn das Ergebnis einer Operation nicht definiert ist. Zum Beispiel ist das Ergebnis der Division von Null durch Null NaN.

2

Es gibt einige besondere Verhalten von Doppel, wenn sie von Null (0,0) Teilen:

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 nur ausgelöst wird, Integer (welches Dezimal ist wie!)