将变量四舍五入到两位小数 C#

50

我想知道如何将变量四舍五入到小数点后两位。在下面的例子中,奖金通常是一个带有四位小数的数字。有没有办法确保支付变量始终四舍五入到小数点后两位?

  pay = 200 + bonus;
  Console.WriteLine(pay);

谷歌搜索?https://dev59.com/TnVC5IYBdhLWcg3wjx1d - eouw0o83hf
作业标签已过时。 - Lee Taylor
哇,作业标签??刚看到它,http://meta.stackexchange.com/questions/147100/the-homework-tag-is-now-officially-deprecated?cb=1 - Habib
8个回答

100

请确保您使用的是floatdoubledecimal类型,否则这将永远无法正常工作。 - Aidiakapi
我正在使用double,但是对我来说仍然不起作用。 - Kerry G
4
将其称为 pay = Math.Round(pay, 2); - Habib
2
重要提示:这将把0.005四舍五入为0.00!请查看Jon在下面的答案,这应该是最佳答案。 - Nullius

37

您应该使用一种形式的Math.Round。请注意,如果未指定MidpointRounding值,Math.Round默认使用银行家舍入(向最近的偶数舍入)。如果您不想使用银行家舍入,则应使用Math.Round(decimal d, int decimals, MidpointRounding mode),如下所示:

Math.Round(pay, 2, MidpointRounding.AwayFromZero); // .005 rounds up to 0.01
Math.Round(pay, 2, MidpointRounding.ToEven);       // .005 rounds to nearest even (0.00) 
Math.Round(pay, 2);    // Defaults to MidpointRounding.ToEven

(为什么.NET使用银行家舍入作为默认值?)


6
decimal pay  = 1.994444M;

Math.Round(pay , 2); 

5
您可以对结果进行四舍五入,然后使用string.Format将精度设置为如下内容:
decimal pay = 200.5555m;
pay = Math.Round(pay + bonus, 2);
string payAsString = string.Format("{0:0.00}", pay);

1
我怀疑你不能在第一行中以两种不同的方式使用 pay 变量!当你已经使用了 Math.Round 函数,或许就没必要再用字符串格式化了吧?如果你不想舍入实际数字而只是想缩短生成的字符串,那么字符串格式化是个好东西。在这种情况下,也可以考虑使用 "F""F2"(以及 "N""N2")格式化字符串,例如 string.Format("{0:N}", pay) 或等价的 pay.ToString("N") - Jeppe Stig Nielsen
@JeppeStigNielsen 你说的第一行绝对正确!已经更正了。有趣的是,我以前从未使用过 {0:N},可能是习惯使然吧 ;o) - Paul Aldred-Bann
进一步解释,"F"会按照当前线程的当前文化的NumberFormat指定的小数位数进行四舍五入。通常情况下是两位小数。"F2"总是保留两位小数。"N""N2"类似,但它们还会根据文化插入组分隔符。例如(11223344.5566m).ToString("N")在某些文化中可能会产生格式化数字"11,223,344.56"。请参阅标准数字格式字符串 - Jeppe Stig Nielsen

2

请确保提供一个数字,通常使用双精度数。Math.Round可以有1-3个参数,第一个参数是您想要舍入的变量,第二个是小数位数,第三个是舍入类型。

double pay = 200 + bonus;
double pay = Math.Round(pay);
// Rounds to nearest even number, rounding 0.5 will round "down" to zero because zero is even
double pay = Math.Round(pay, 2, MidpointRounding.ToEven);
// Rounds up to nearest number
double pay = Math.Round(pay, 2, MidpointRounding.AwayFromZero);

2
请注意,Round函数会进行四舍五入。
因此(我不知道在您的行业中是否重要),请注意:
float a = 12.345f;
Math.Round(a,2);

//result:12,35, and NOT 12.34 !

为了更准确地适应你的情况,我们可以这样做:
int aInt = (int)(a*100);
float aFloat= aInt /100.0f;
//result:12,34 

Math.Round不接受浮点数作为参数。 - Willy David Jr

2

1
Console.WriteLine(decimal.Round(pay,2));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接