将精度四舍五入为两位数会出现意外情况

时间:2018-10-02 20:25:06

标签: c# .net

我正在四舍五入一个特定的double值,并期望获得一定的结果,但是没有实现。这使我好奇是否存在缺陷,或者我是否在基础逻辑中缺少某些东西。

请参见以下代码段:

double value = 0.01075;
Console.WriteLine(Math.Round(value, 4, MidpointRounding.AwayFromZero));

生产

0.0107

使用AwayFromZero使我认为它应该做0.0108。我尝试了几个不同的示例(如下所示),并且在每个实例中都获得了预期的结果,但上面列出的实例除外。帮助吗?!

double value = 0.010075;
Console.WriteLine(Math.Round(value, 5, MidpointRounding.AwayFromZero));
// 0.01008

value = 0.01075;
Console.WriteLine(Math.Round(value, 4, MidpointRounding.AwayFromZero));
// 0.0107

value = 0.010750000001;
Console.WriteLine(Math.Round(value, 4, MidpointRounding.AwayFromZero));
// 0.0108

value = 0.01065;
Console.WriteLine(Math.Round(value, 4, MidpointRounding.AwayFromZero));
// 0.0107

value = 0.01055;
Console.WriteLine(Math.Round(value, 4, MidpointRounding.AwayFromZero));
// 0.0106

value = 0.0175;
Console.WriteLine(Math.Round(value, 3, MidpointRounding.AwayFromZero));
// 0.018

value = 0.175;
Console.WriteLine(Math.Round(value, 2, MidpointRounding.AwayFromZero));
// 0.18

value = 0.75;
Console.WriteLine(Math.Round(value, 1, MidpointRounding.AwayFromZero));
// 0.8

注意:将Visual Studio Pro 2015与.Net 4.5.2一起使用

1 个答案:

答案 0 :(得分:5)

大多数十进制数字不能完全表示为浮点数。至少根据Docs,最接近0.01075的double值恰好是0.0107499999999999991395771559155。那不是0.01070.0108之间的中点,因此中点舍入模式不会起作用。

顺便说一句,这就是为什么切勿使用浮点数赚钱的原因。