2017-08-09 2 views
-3

I berechnen einen Wert von 3 Werten eine Auswahl aus einer Liste zu machen:Warum führt meine Mathematik zu einem falschen Bool?

var applicable = from b in discounts.ToList() where 
    (b["Interest Rate"].Cast<double>() + 
    (-b["Discount/Premium"].Cast<double>()) + 
    ((-b["Discount/Premium"].Cast<double>())/(b["Term"].Cast<int>()/12))) >= GlobalVar.minRealReturn 
    select b; 

Als ich das erste Element der „anwendbar“ nehmen erhalte ich ein Element, das nicht in der Liste sein soll (ich überprüfe . für Elemente mit einem Ergebnis über 14 noch bekam dieses Element ein Ergebnis von 13,975)

enter image description here

+0

Ist 'b' ein Wörterbuch? – Dido

+0

nein, b ist eine arevariable "Zeile" von excelsheet bei dezimal erhalte ich die fehlermeldung "der '+' operator kann nicht mit typ decmal und double verwendet werden. Ich tauschte alle doppelt mit dezimal –

+0

Sie sollten Ihren Code umstellen Es ist lesbarer: Verwenden Sie Modelle mit Eigenschaften anstelle von Wörterbüchern, deren Einträge Sie nach Namen suchen und dann umwandeln müssen Sind Sie sicher, dass "anwendbar" immer einen Wert zurückgibt? Wenn nicht, erhalten Sie eine Ausnahme. – Dido

Antwort

1

Das Hauptproblem ist wahrscheinlich, dass:

b["Term"].Cast<int>()/12 

tut nicht, was Sie denken, dass es tut.

Nehmen wir an, dass b["Term"].Cast<int>() 18 war. Sie könnten erwarten, dass 18/12 in 1.5 resultieren würde. Aber das tut es nicht. Es ergibt 1 - seit Sie integer division tun.

Als solche müssen Sie wahrscheinlich den Code ändern:

b["Term"].Cast<int>()/12D 

Da das wird es zwingen nicht Integer-Division zu verwenden. Sie können die Cast<int> alternativ auch in Cast<double> konvertieren.

+0

Vielen Dank! Ich habe festgestellt, dass ich in meiner Messagebox verdopple, was zu dem richtigen Wert geführt hat. In diesem Fall bleiben Sie lieber doppelt als dezimal, da die Anwendung –

+0

* sehr zeitkritisch ist –

Verwandte Themen