为什么在c#2.135中总是舍入(使用2位小数)到2.13

时间:2014-12-04 10:28:13

标签: c# .net rounding

默认情况下使用Math.Round(doubleValue, 2) // ToEven时

// 2.135 - > 2.13为什么不2.14?

// 3.135 - > 3.14

当在2.13使用AwayFromZero 2.135轮时为什么不是2.14?

1 个答案:

答案 0 :(得分:6)

要回答标题中的问题:

2.135 总是四舍五入(使用2位小数)到2.13,这只是在您的情况下发生,因为您使用的是二进制浮点数据类型。 (正如leppie所指出的,2.135无法准确表示为双精度,请注意Microsoft seems to disinguish between decimal and floating point types,即使小数也符合定义)

如果您使用decimal作为数据类型而不是舍入行为,则可以比较this snippet的不同输出以验证:

decimal val1 = 2.135m;
decimal val2 = 3.135m;

Console.WriteLine("decimal val1({0}) rounded = {1}", val1, Math.Round(val1, 2));
Console.WriteLine("decimal val2({0}) rounded = {1}", val2, Math.Round(val2, 2));

double dval1 = 2.135;
double dval2 = 3.135;

Console.WriteLine("double val1({0}) rounded = {1}", dval1, Math.Round(dval1, 2));
Console.WriteLine("double val2({0}) rounded = {1}", dval2, Math.Round(dval2, 2));