Ich habe das folgende Snippet in der VS2015 C # interaktiv ausgeführt und ein sehr merkwürdiges Verhalten bekommen.
%Vor%Warum hat die Methode Unendlichkeit zurückgegeben, während 3/0 einen Fehler und 3 / b einen Formationsfehler ausgelöst hat? Kann ich erzwingen, dass die Division einen Fehler geworfen hat, anstatt unendlich zurückzugeben?
Wenn ich die Methode zu
umformatiere %Vor%würde die neue DivideByZeroException die gleichen Informationen und die gleiche Struktur enthalten wie die abgefangene Ausnahme?
Ich habe das folgende Snippet in der VS2015 C # interaktiv ausgeführt und ein sehr merkwürdiges Verhalten bekommen.
%Vor%Warum hat die Methode Unendlichkeit zurückgegeben, während 3/0 einen Fehler und 3 / b einen Formationsfehler ausgelöst hat? Kann ich erzwingen, dass die Division einen Fehler geworfen hat, anstatt unendlich zurückzugeben?
Wenn ich die Methode zu
umformatiere %Vor%würde die neue DivideByZeroException die gleichen Informationen und die gleiche Struktur enthalten wie die abgefangene Ausnahme?
Wie bereits oben erwähnt, liegt es an Ihnen, dass Sie double als Divisor verwenden. Sie können es beweisen, indem Sie das Beispiel Ihrer Variablen verwenden, aber NaN
anstelle von %code% verwenden.
Es liegt daran, dass Sie System.Double verwenden.
Wie von MSDN DivideByZeroException wird nur für ganzzahlige Typen und Decimal ausgelöst.
Das liegt daran, dass es schwierig ist, eine "so genannte" Null für den Double-Wert zu definieren.
PositiveInfinity ergibt sich auch aus einer Division durch Null mit einem positiven Dividend, und NegativeInfinity ergibt sich aus einer Division durch Null mit einem negative Dividende. (Quelle: MSDN erneut )
DivideByZeroException ist nicht für Gleitkommatypen geeignet. Hinweis: Sie können %code% erhalten, wenn Sie versuchen, durch Null mit einem Dividend von Null zu teilen.
Int in Java ist das Zweierkomplement. Ein Zweierkomplement-Integer hat keine Bits zur Verfügung, um spezielle Werte wie Infinity oder NaN zu speichern. Da das Ergebnis nicht im gewünschten Typ dargestellt werden kann, muss eine Ausnahme ausgelöst werden. Gleitkommazahlen haben dieses Problem nicht (für Infinity ist ein Bitmuster verfügbar), und daher ist keine Ausnahme erforderlich.
Warum hat die Methode unendlich zurückgegeben, während 3/0 einen Fehler ausgegeben hat und 3/0 b hat einen formatierten Fehler geworfen?
Da im ersten Fall die 0 keine Ganzzahl ist, ist sie doppelt. Während in der Sekunde ist eine ganze Zahl. Sie sollten hier feststellen, dass ein Double eine Gleitkommazahl ist. Es hat also keinen genauen Wert wie eine Ganzzahl. Auf der anderen Seite kann eine ganze Zahl von einem Computer mit 100% Genauigkeit dargestellt werden.
Hier können Sie einen sehr schönen Artikel über Fließkommazahlen finden.
Warum hat die Methode unendlich zurückgegeben, während 3/0 einen Fehler ausgegeben hat und 3/0 b hat einen formatierten Fehler geworfen?
Da im ersten Fall die 0 keine Ganzzahl ist, ist sie doppelt. Während in der Sekunde ist eine ganze Zahl. Sie sollten hier feststellen, dass ein Double eine Gleitkommazahl ist. Es hat also keinen genauen Wert wie eine Ganzzahl. Auf der anderen Seite kann eine ganze Zahl von einem Computer mit 100% Genauigkeit dargestellt werden.
Hier können Sie einen sehr schönen Artikel über Fließkommazahlen finden.
Wie bereits oben erwähnt, liegt es an Ihnen, dass Sie double als Divisor verwenden. Sie können es beweisen, indem Sie das Beispiel Ihrer Variablen verwenden, aber double
anstelle von var
verwenden.
Int in Java ist das Zweierkomplement. Ein Zweierkomplement-Integer hat keine Bits zur Verfügung, um spezielle Werte wie Infinity oder NaN zu speichern. Da das Ergebnis nicht im gewünschten Typ dargestellt werden kann, muss eine Ausnahme ausgelöst werden. Gleitkommazahlen haben dieses Problem nicht (für Infinity ist ein Bitmuster verfügbar), und daher ist keine Ausnahme erforderlich.
Tags und Links c# exception-handling dividebyzeroexception infinity