首页 > 解决方案 > C#:Math Round() 为不同的小数产生不同的值

问题描述

使用不同的小数点时,我得到了不同的值Math.Round,有人可以纠正我哪里出错了。

   double r = Math.Round(1.235, 2,MidpointRounding.AwayFromZero);
   double t = Math.Round(19.185, 2,MidpointRounding.AwayFromZero);

r结果为 1.24,而t结果为 19.18,预期结果为t19.19。

标签: c#.netrounding

解决方案


根据Math.Round,来电者须知部分

由于将十进制值表示为浮点数或对浮点值执行算术运算可能导致精度损失,因此在某些情况下,该Round(Double, Int32, MidpointRounding)方法可能不会像mode参数指定的那样对中点值进行四舍五入。这在以下示例中进行了说明,其中 2.135 舍入为 2.13 而不是 2.14。

这听起来像你的确切情况,由于精度损失19.185被四舍五入19.18而不是19.19. G17 您可以使用格式说明符显示值以查看所有有效数字的精度

Console.WriteLine(1.235.ToString("G17"));
Console.WriteLine(19.185.ToString("G17"));

输出将是这样的

1.2350000000000001

19.184999999999999

作为可能的解决方法,您可以使用decimal精度更高的值

var r = Math.Round(1.235m, 2, MidpointRounding.AwayFromZero);
var t = Math.Round(19.185m, 2, MidpointRounding.AwayFromZero);

结果将在意料之中


推荐阅读