舍入双精度到4位精度具有意外行为

Spo*_*ins 1 .net c#

我正在舍入一个特定的双重值,并期待一定的结果,但它没有通过.这让我很好奇,如果存在缺陷,或者我在底层逻辑中遗漏了什么.

请参阅以下代码段:

double value = 0.01075;
Console.WriteLine(Math.Round(value, 4, MidpointRounding.AwayFromZero));
Run Code Online (Sandbox Code Playgroud)

产生

0.0107
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

注意:使用Visual Studio Pro 2015和.Net 4.5.2

No *_*o U 5

大多数十进制数不能完全表示为浮点数.最接近的双值0.01075恰好是0.0107499999999999991395771559155,至少根据这个计算器.这并不是之间的中点0.01070.0108,所以中点舍入模式不发挥作用.

顺便说一下,这就是为什么你从不使用浮点钱.