C# 为什么Math.Round在十进制和双精度之间表现不同

C# 为什么Math.Round在十进制和双精度之间表现不同,c#,C#,我有两个测试,第一个通过,第二个不通过。为什么? //decimal Assert.Equal(35.00M, Math.Round(34.995M, 2)); //double Assert.Equal(35.00, Math.Round(34.995, 2)); 这是因为二进制浮点数的性质——大多数十进制数无法表示 34.995是一个完美的例子-当分配给双变量时,实际内容将是34.994999999997-这是一个很小的分数 因此,它将向下舍入,而不是向上舍入到34.99(或者准确地说:

我有两个测试,第一个通过,第二个不通过。为什么?

//decimal
Assert.Equal(35.00M, Math.Round(34.995M, 2));

//double
Assert.Equal(35.00, Math.Round(34.995, 2));

这是因为二进制浮点数的性质——大多数十进制数无法表示

34.995
是一个完美的例子-当分配给
双变量时,实际内容将是
34.994999999997
-这是一个很小的分数

因此,它将向下舍入,而不是向上舍入到
34.99
(或者准确地说:
34.99000000000002

因此,当一个人用十进制思考时,它的行为将不同于预期。然而,这并不是一个bug或什么的,而是计算机工作方式的结果,这是我们应该注意的

一般来说:人们永远不要期望二进制浮点数是精确的


有关更多信息,请参见

,因为浮点数就是这样工作的-永远不要期望它们是精确的。35.995不能精确表示为double,因此变量包含的值略小于该值(34.994999999997),这就是为什么它向下舍入(34.99000000000002)。@Franzgleichman请将此设置为答案,我会接受,谢谢