2016-03-29 6 views
1

Beim Versuch, einen einfachen C# Mathe-Rechner zu finden, habe ich einen unten gefunden. C# Math calculatorÜber die Syntax von C# DataTable.Compute()

Es ist ideal für mich, da es keine COM oder andere Drittanbieter-Referenz benötigt. Allerdings habe ich eine verwirrende Sache herausfinden:

new DataTable().Compute("2-3/4*12", null) // Works fine, answer is -7; 
new DataTable().Compute("2/0", null) // Works but not correct, answer is 8; 
new DataTable().Compute("100/0", null) // Works but not correct, answer is 8; 
new DataTable().Compute("2.0/0", null) // Throw System.DivideByZeroException as estimated. 

So würde ich fragen, was ist los mit den zweiten und dritten Zeilen? Ist die Rechenmethode das "/" anders zu behandeln?

Ich habe gelesen: https://msdn.microsoft.com/en-us/library/system.data.datatable.compute.aspx, aber nichts hilfreiches.

+0

Siehe [hier] (http://stackoverflow.com/questions/4609698/inconsistency-in-divide-by-zero-behavior-between-different-value-types). Es hat etwas mit den Datentypen zu tun, die im Hintergrund verwendet werden. Wenn Sie versuchen würden, 'var divByZero = 2/0;' zu verwenden, erhalten Sie den Kompilierungsfehler –

+0

@ Nitro.de. Ich denke, mein Problem unterscheidet sich von dem, auf das Sie sich bezogen haben. Da ich kein double oder int deklariere, benutze ich nur writeline, um das Ergebnis zu sehen. – Mamsds

+0

Richtig Sie nicht, aber wissen Sie, was Computer im Hintergrund tut? –

Antwort

0

Ich versuchte Ihren Code in LinqPad mit den folgenden Ergebnissen:

new DataTable().Compute("2/0", null); // Gives infinity (object{double}) 
new DataTable().Compute("100/0", null); // Gives infinity (object{double}) 
new DataTable().Compute("100/0", null); // Gives divideByZeroException 

Aus meinem Testcode:

 var result = (double) new DataTable().Compute("20/0", null); 

     if(double.IsInfinity(result)) 
     { 
      Console.WriteLine("Oh noes!"); // Debugger lands here 
     } 
     Console.WriteLine(result); 
    } 

Der Begriff der Unendlichkeit im Doppel existiert. Ich bin nicht sicher, warum Sie die Ausnahme auf der letzten bekommen. Hoffentlich kann jemand dazu etwas sagen.

+0

Hi @ pedro-g-dias, meinst du "100.0/0" auf deinem dritten Ausdruck? Für mich scheint es einen Unterschied zwischen den Integer- und Float-Berechnungen zu geben. Mit dem Float wird die Ausnahme ausgelöst. – CJBrew

0

Ein Teil dieser Frage bereits beantwortet: Why is infinity printed as "8" in the Windows 10 console?

Wir haben eine Anwendung, die auf Windows 8.1 wird „Infinity“ für einen Ausdruck wie „1/0“ drucken. Unter Windows 10 wird "8" zurückgegeben.

Es ist kein numerischer Wert von 8, sondern ein falsch angezeigtes Unicode-Zeichen (das ein tot-8 sein sollte).