diff --git a/DFe.Classes/Valor.cs b/DFe.Classes/Valor.cs index df68d2e1c..b28c23519 100644 --- a/DFe.Classes/Valor.cs +++ b/DFe.Classes/Valor.cs @@ -1,4 +1,5 @@ -using System.Globalization; +using System; +using System.Globalization; namespace DFe.Classes { @@ -6,9 +7,9 @@ public static class Valor { public static decimal Arredondar(this decimal valor, int casasDecimais) { - var valorNovo = decimal.Round(valor, casasDecimais); - var valorNovoStr = valorNovo.ToString("F" + casasDecimais, CultureInfo.CurrentCulture); - return decimal.Parse(valorNovoStr); + var valorArredondado = decimal.Round(valor, casasDecimais, MidpointRounding.ToEven); + var valorArredondadoFormatado = valorArredondado.ToString("F" + casasDecimais, CultureInfo.CurrentCulture); + return decimal.Parse(valorArredondadoFormatado); } public static decimal? Arredondar(this decimal? valor, int casasDecimais) diff --git a/DFe.Testes/Valores/DadosDeTeste/ValorDadosDeTeste.cs b/DFe.Testes/Valores/DadosDeTeste/ValorDadosDeTeste.cs new file mode 100644 index 000000000..a1adc3345 --- /dev/null +++ b/DFe.Testes/Valores/DadosDeTeste/ValorDadosDeTeste.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace DFe.Testes.Valores.DadosDeTeste +{ + public class ValorDadosDeTeste + { + public static IEnumerable ObterValoresDecimaisParaArredondar() + { + return new List + { + new object[] { 20.35m * 15.90m, 2 }, + new object[] { 0.35m * 15.90m, 2 }, + new object[] { 3.665m, 2 }, + new object[] { 4.775m, 2 }, + + new object[] { 20.35m * 15.90m, 3 }, + new object[] { 0.35m * 15.90m, 3 }, + new object[] { 4.77575m, 4 }, + new object[] { 5.445545m, 5 }, + }; + } + } +} diff --git a/DFe.Testes/Valores/ValorTesteUnitario.cs b/DFe.Testes/Valores/ValorTesteUnitario.cs new file mode 100644 index 000000000..77995952f --- /dev/null +++ b/DFe.Testes/Valores/ValorTesteUnitario.cs @@ -0,0 +1,20 @@ +using DFe.Testes.Valores.DadosDeTeste; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using NFe.Classes; + +namespace DFe.Testes.Valores +{ + [TestClass] + public class ValorTesteUnitario + { + [TestMethod(displayName: "Dado um valor e uma quantidade de casas decimais, quando o arredondamento for feito utilizando os métodos da DFe e NFe, então o valor arredondado deve ser igual em ambos os casos")] + [DynamicData(nameof(ValorDadosDeTeste.ObterValoresDecimaisParaArredondar), typeof(ValorDadosDeTeste), DynamicDataSourceType.Method)] + public void DadoUmValorEUmaQuantidadeDeCasasDecimaisQuandoOArredondamentoForFeitoUtilizandoOsMetodosDaDfeENfeEntaoOValorArredondadoDeveSerIgualEmAmbosOsCasos(decimal valor, int casasDecimais) + { + var valorArredondadoDfe = Classes.Valor.Arredondar(valor, casasDecimais); + var valorArredondadoNfe = Valor.Arredondar(valor, casasDecimais); + + Assert.AreEqual(valorArredondadoDfe, valorArredondadoNfe); + } + } +} diff --git a/NFe.Classes/Valor.cs b/NFe.Classes/Valor.cs index 27c5869ef..5a86a7381 100644 --- a/NFe.Classes/Valor.cs +++ b/NFe.Classes/Valor.cs @@ -7,9 +7,9 @@ public static class Valor { public static decimal Arredondar(this decimal valor, int casasDecimais) { - var valorNovo = decimal.Round(valor, casasDecimais, MidpointRounding.AwayFromZero); - var valorNovoStr = valorNovo.ToString("F" + casasDecimais, CultureInfo.CurrentCulture); - return decimal.Parse(valorNovoStr); + var valorArredondado = decimal.Round(valor, casasDecimais, MidpointRounding.ToEven); + var valorArredondadoFormatado = valorArredondado.ToString("F" + casasDecimais, CultureInfo.CurrentCulture); + return decimal.Parse(valorArredondadoFormatado); } public static decimal? Arredondar(this decimal? valor, int casasDecimais)