Math.Round(double,2) returns 1 位小数

Math.Round(double,2) returns 1 decimal

为什么这段代码 returns 1 decimal 而不是 2

p = Math.Round(9431.796, 2);

如果我用 p = Math.Round(9431.796, 4); 替换它,它仍然 returns 1 decimal

如果将 9431.796 四舍五入到小数点后两位,将得到 9431.80

数值数据类型不存储实际数字。它们存储数字的表示。 9431.809431.8是完全相同的数,存放在decimaldouble变量中时不区分。

因此,如果您显示 9431.80 而未按某种方式对其进行任何格式化,它将显示为 9431.8。所以问题在于您对数字如何存储在数字数据类型中的理解。

您使用 .ToString() 创建了一个具有特定小数位数的字符串。在这种情况下,您不需要使用 Math.Round().ToString() 将其四舍五入:

var p = 9431.796.ToString("0.00");
Console.WriteLine(p);                // 9431.80

Math.Round(9431.796, 2) return 保留一位小数,因为它四舍五入为 9431.80。显示时,它会去掉最后一个 0,这就是为什么你只看到一位小数的原因。
Math.Round(9431.796, 4) 绝对应该 return 9431.796。你能再测试一下吗?

你不能,因为 9431.80 等于 9431.8。然而,在这种情况下,我猜想您想以特定格式打印出来,可以这样做:

string p = Math.Round(9431.796, 2).ToString("0.00");

因为它四舍五入到 9431.80 它删除了最后一个无用的 0。我会使用:

int nbDec = 2;
p = Math.Round(9431.796, nbDec );
Console.Out.WriteLine(p.ToString("#,##0." + new string('#',nbDec ));

这将显示 9,431.80

如果您想要更多或更少的小数,只需更改 nbDec 值。