Loading...
Area: Episerver Commerce
Applies to versions: 10 and higher
Other versions:

Rounding totals for currencies

Recommendations [hide]

This topic explains the proper way to round amounts in Commerce orders. Rounding is complex because different currencies use different numbers of decimal places.

How it works

The following methods return a value with the correct number of decimals, which is determined by the input currency.

  • Currency.Round()
  • Currency.Percentage()
  • Money.Round()

Do not use Math.Round() for rounding. For example, do not use the following code.

var currentCurrency = “JPY” 
Money itemPrice = new Money(Math.Round(lineItem.ListPrice, 2), currentCurrency);

If you currently use Math.Round, replace it like this.

var currentCurrency = “JPY”
Money itemPrice = new Money(lineItem.ListPrice, currentCurrency).Round();

Calculating and rounding an order total

After rounding, use the rounded value for all further totals. For example, here is the correct way to add a number.

var billingCurrency = order.Currency;
foreach (var item in order.GetAllLineItems())
  {
    var costWithoutDiscount = billingCurrency.Round(item.PlacedPrice * item.Quantity);
    item.Properties["costWithoutDiscount"] = costWithoutDiscount;
  }

Calculating taxes

To get an order‘s correctly-rounded tax amount, do not use the tax amount of individual items. Instead, follow this example.

var billingCurrency = order.Currency;
var saleTaxesAmount = taxes
  .Where(x => x.TaxType == TaxType.SalesTax)
  .Sum(x => billingCurrency.Percentage(itemPriceWithoutTax, x.Percentage));

In the above code, saleTaxesAmount is returned with a rounded value.

Note: Do not use billingCurrency.Percentage(itemPriceWithoutTax, x.Percentage) in other situations

Do you find this information helpful? Please log in to provide feedback.

Last updated: Oct 24, 2016

Recommendations [hide]