2016-11-11 1 views
0

Ich bin auf ein Problem, das ich denke, in meinem Kopf sollte funktionieren, aber immer wieder die gleiche Divide by Zero Fehler. HierSchutz gegen Divide von Null

ist der Code verwende ich, dass ich denke, sollte dagegen schützen:

GoalBarValue = Convert.ToInt32(((decimal)CompletedToday/
((decimal)CompletedYesterday) == 0 ? (decimal?)null : (decimal)CompletedYesterday) 
* 100); // Divide by zero protection 

CompletedToday comes back as 0 
CompletedYesterday comes back as 0 

Welche völlig in Ordnung ist und wie ich erwarte, dass es sollte.

Der genaue Fehler, der zurückgegeben wird, ist Attempted to divide by zero.

Ist etwas falsch mit der Art, wie ich gegen sie schützen möchte?

+8

Sie versuchen, in einer Zeile wayyyy zu viel zu tun. Brechen Sie das ab und verhindern Sie die Berechnung, wenn der Nenner 0 ist, bevor Sie zur Berechnung kommen. – axlj

+0

Warum versuchen Sie nicht {...} (DivideByZeroException) {...} zu fangen? – Vyrira

+0

Was wollen Sie als Ergebnis von Division durch Null bekommen? Null? –

Antwort

4

"Stimmt etwas nicht mit der Art, wie ich dagegen zu schützen versuche?"

Ja tatsächlich, Sie teilen durch Null! Die einzige Möglichkeit, dass 0 das Ergebnis Ihrer Berechnung sein kann, ist, wenn CompletedToday 0 ist. Im anderen Fall teilen Sie durch 0 und erhalten die nette Ausnahme. Warum Sie nicht nur überprüfen, ob der Divisor 0 ist, und wenn nicht die Berechnung durchführen sonst geben eine null:

GoalBarValue = Convert.ToInt32((decimal)CompletedYesterday) == 0 ? 
       (decimal?)null : (decimal)CompletedYesterday * 100; 

Stellen Sie sich vor Sie würde überprüfen, ob Sie schlagen den Kopf gegen eine Wand durch den Kopf gegen die Wand schlagen ..... es wäre nicht ratsam.

EDIT:

Wenn Sie 2 Zuordnungen von verschiedenen Variablen (wie Sie in Ihrem Kommentar geschrieben), dann die ? operator ist Ihnen nicht viel nützen. Es erlaubt nur 1.

Ich würde vorschlagen, an der alten Mode Weise zu bleiben. Wenn Sie wirklich die 2 Zuweisungen in einer Zeile möchten:

if((decimal)CompletedYesterday) == 0) 
    GoalBarValue = CompletedYesterday = null; 
else GoalBarValue = // what ever you want to calculate... 
+0

Ich denke, ein besserer Weg, die Frage zu formulieren ist. Warum funktioniert die Lösung, die ich verwendet habe, um 'CompletedYesterday' auf' null' zu stellen, nicht? So wie ich es geschrieben habe, sollte "CompletedYesterday" in "(dezimal?) Null" umgewandelt werden, wenn es 0 ist. Aber ich denke, es funktioniert nicht oder ich habe etwas falsch gemacht. –

+0

Mit dem Operator '?' Weisen Sie den Wert 'GoalBarValue' zu. Haben Sie versucht, 2 Werte gleichzeitig zuzuordnen? –

+2

@JamesWilson Sehen Sie sich die Platzierung Ihrer Klammern an. Sie überprüfen nicht, ob "CompletedYesterday" 0 ist. Sie überprüfen, ob "CompletedToday/CompletedYesterday" 0 ist. Wenn "CompletedToday" 0 ist, erhalten Sie 0, aber wenn "CompletedYesterday" 0 ist, erhalten Sie eine DivideByZero-Ausnahme _because Sie teilen durch zero_. – Abion47

3

Ist das, was Sie wollen?

if (Convert.ToDecimal(CompletedYesterday) == 0) 
{ 
    goalBarValue = null; 
} 
else 
{ 
    goalBarValue = Convert.ToInt32(Convert.ToDecimal(CompletedToday)/Convert.ToDecimal(CompletedYesterday)) * 100; 
} 

eine Zeilenversion von oben Code

goalBarValue = Convert.ToDecimal(CompletedYesterday) == 0 ? null : Convert.ToInt32(Convert.ToDecimal(CompletedToday)/Convert.ToDecimal(CompletedYesterday)) * 100;