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请将此设置为答案,我会接受,谢谢