2017-08-09 6 views
-3

Je calcule une valeur de 3 valeurs pour effectuer une sélection dans une liste:Pourquoi mon calcul aboutit-il à un mauvais 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; 

Quand je prends le premier élément de « applicable » Je reçois un élément qui ne devrait pas être dans la liste (je vérifie . pour les éléments avec un résultat plus 14 encore cet élément a obtenu un résultat de 13,975)

enter image description here

+0

Est-ce que 'b' est un dictionnaire? – Dido

+0

non, b est une variable "Row" d'excelsheet lors de l'utilisation de la décimale je reçois le message d'erreur "l'opérateur '+' ne peut pas être utilisé avec le type decmal et le double.J'échange tout double avec la décimale –

+0

Vous devez refactoriser votre code pour faire Utilisez des modèles avec des propriétés à la place des dictionnaires dont vous avez besoin de rechercher les entrées par nom, puis lancez le jeu. Êtes-vous sûr que 'applicable' retournera toujours une valeur? Si ce n'est pas le cas, vous obtiendrez une exception – Dido

Répondre

1

Le principal problème est probable que:

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

ne fait pas ce que vous pensez qu'il fait. Disons que b["Term"].Cast<int>() avait 18 ans. Vous pourriez vous attendre à ce que 18/12 se traduise par 1.5. Mais ce n'est pas le cas. Il en résulte 1 - puisque vous faites integer division.

En tant que tel, vous devez probablement changer le code:

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

Depuis forcera pas à utiliser la division entière. Vous pouvez également convertir le Cast<int> en Cast<double>.

+0

Merci beaucoup! J'ai noté que j'ai moulé pour doubler dans ma boîte à message qui a mené à la valeur correcte. ill rester avec double plutôt que décimale dans ce cas, car l'application –

+0

* est très timecritique –