2016-07-29 2 views
0

Итак, я проверил Format currency without rounding и некоторые другие сообщения, но я не уверен, что нашел свою конкретную ошибку где угодно.Вопросы округления суммы строки String.format

Посмотреть

@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> 

База данных Результаты для cashMoney

12.2 
13.3 

Просмотр результатов

$12 
$13 

Total Line - $26 

H ow я получаю, что моя личная общая линия не округляется? Тип данных для cashMoney: decimal?

+0

Есть ли причина для исключения десятичного значения с точки зрения? Можно утверждать, что это проблема (https://en.wikipedia.org/wiki/Salami_slicing) – StingyJack

+0

Пара хороших ответов, которые задают пару полезных вопросов. 1. Вы хотите, чтобы ваша сумма была равна сумме округленных значений? т. е. вы хотите 12,2 (округлено до 12) + 13,3 (округлено до 13) до = 25 (сумма 12 + 13) или 26 (округленный результат от суммы 12,2 + 13,3)? Еще один способ подумать о том, каков ваш ожидаемый результат от $ 10,40 + $ 10,40? – EtherDragon

ответ

2

То, что вы видите, является правильным. .Sum() из 12.2 и 13.3 равен 25,5, который округляется до 26, когда применяется формат.

Что вы хотите сделать это вместо того, чтобы подвести, как вы итерацию через петлю Еогеасп:

@{ 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

Это не '.Sum()' вызывает округление; это спецификатор формата. –

+0

@BlackFrog Уточнил мой комментарий, чтобы обозначить, что '.Sum()' возвращает значение, которое спецификатор формата будет округлять. – krillgar

1

Если вы не хотите, округлой формы, использовать различные Currency ("C") Format Specifier.

Например:

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}"); 

Выходы следующие:

 
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

Смежные вопросы