2016-07-29 9 views
0

So habe ich überprüft Format currency without rounding und einige andere Beiträge, aber ich bin mir nicht sicher, ich finde meinen spezifischen Fehler überall.String.format Währung Summe Rundungsausgaben

Ansicht

@foreach (var item in attyData) 
{ 
    <tr> 
     <td>@String.Format("{0:C0}", item.cashMoney)</td> 
    </tr> 
}     
<tr class="info"> 
    <td>@String.Format("{0:C0}", Model.attyData.Sum(item => item.cashMoney))</td>      
</tr> 

Datenbank Ergebnisse für cashMoney

12.2 
13.3 

Ergebnisse anzeigen

$12 
$13 

Total Line - $26 

H wie bekomme ich meine individuelle Gesamtlinie nicht um? Der Datentyp für cashMoney ist decimal?

+0

Gibt es einen Grund für den Dezimalwert aus der Sicht ohne? Man könnte argumentieren, dass das Problem ist (https://en.wikipedia.org/wiki/Salami_slicing) – StingyJack

+0

Paar gute Antworten, die ein paar nützliche Fragen stellen. 1. Soll Ihre Summe gleich der Summe der gerundeten Werte sein? d.h. wollen Sie 12,2 (auf 12 gerundet) + 13,3 (auf 13 gerundet) auf 25 (Summe aus 12 + 13) oder 26 (gerundetes Ergebnis aus der Summe von 12,2 + 13,3)? Eine andere Möglichkeit, darüber nachzudenken, ist, was ist Ihr erwartetes Ergebnis von 10,40 $ + 10,40 $? – EtherDragon

Antwort

2

Was Sie sehen, ist korrekt. Die .Sum() von 12.2 und 13.3 ist 25.5, die auf 26 umläuft, wenn das Format angewendet wird.

Was wollen Sie stattdessen zu tun ist, um es zusammenzufassen, wie Sie durch Ihre foreach-Schleife durchlaufen:

@{ var total = 0; } 

@foreach (var item in attyData) 
{ 
    var cash = Math.Round(item.cashMoney); 
    total += cash; 
    <tr> 
     <td>@String.Format("{0:C0}", cash)</td> 
    </tr> 
}     
<tr class="info"> 
    <td>@String.Format("{0:C0}", total)</td>      
</tr> 
+0

Es ist nicht die '.Sum()' verursacht die Rundung; Es ist der Format-Spezifizierer. –

+0

@BlackFrog Verdeutlicht meinen Kommentar, um anzuzeigen, dass '.Sum()' den Wert zurückgibt, den der Formatbezeichner aufrunden soll. – krillgar

1

Wenn Sie es nicht wollen, gerundet, eine andere Currency ("C") Format Specifier verwenden.

Zum Beispiel:

decimal a = 12.2M; 
decimal b = 13.3M; 

var sum = a + b; 

Console.WriteLine($"C0 --- > {a,-8:C0} -- {b,-8:C0} -- {sum,-8:C0}"); 
Console.WriteLine($"C1 --- > {a,-8:C1} -- {b,-8:C1} -- {sum,-8:C1}"); 
Console.WriteLine($"C2 --- > {a,-8:C2} -- {b,-8:C2} -- {sum,-8:C2}"); 
Console.WriteLine($"C3 --- > {a,-8:C3} -- {b,-8:C3} -- {sum,-8:C3}"); 

Ausgänge der folgende:

 
C0 --- > $12  -- $13  -- $26 
C1 --- > $12.2 -- $13.3 -- $25.5 
C2 --- > $12.20 -- $13.30 -- $25.50 
C3 --- > $12.200 -- $13.300 -- $25.500 

enter image description here