C# Math.Round vs.String.Format

C# Math.Round vs.String.Format,c#,C#,我需要将双精度值四舍五入到2位数。 什么更可取 String.Format("{0:0.00}", 123.4567); // "123.46" Math.Round(123.4567, 2) // "123.46" 前者输出字符串,后者输出双精度。你对结果有什么用?这个问题的答案将给出您问题的答案。它们是不同的函数,如果您需要显示输出,请使用第一个(这也会强制显示小数)。如果变量的类型为double,则可以避免不可避免的.ToString()开销

我需要将双精度值四舍五入到2位数。 什么更可取

String.Format("{0:0.00}", 123.4567);      // "123.46"
Math.Round(123.4567, 2)                   // "123.46"

前者输出字符串,后者输出双精度。你对结果有什么用?这个问题的答案将给出您问题的答案。

它们是不同的函数,如果您需要显示输出,请使用第一个(这也会强制显示小数)。如果变量的类型为double,则可以避免不可避免的.ToString()开销


请注意,第二个值对数字进行四舍五入,但如果是整数结果,则只会得到整数(即:7 vs 7.00)

,这取决于您想对其执行什么操作


String.Format
将返回一个字符串,
Math.Round(double)
将返回一个double

如果希望以
字符串的形式返回此值,则
字符串.Format
更好,如果希望以
双精度的形式返回此值,则
数学.Round
更好。这完全取决于你的要求。

数学。数字大于0的四舍五入(双位数)
在概念上是非常不干净的。但我认为它永远不应该被使用
double
是一个二进制浮点数,因此没有定义好的十进制数字概念

我建议使用
string.Format
,或仅当您仅需要为十进制显示目的进行四舍五入时使用
ToString(“0.00”)
,如果您需要对实际数字进行四舍五入(例如,在进一步计算中使用它),则使用
decimal.round

注意:使用
decimal.Round
可以指定模式。通常希望
从零开始
四舍五入,而不是
四舍五入

使用
ToEven
四舍五入
0.005m
四舍五入为
0.00
0.015
四舍五入为
0.02
。这不是大多数人所期望的

比较:

  • ToEven:3.75轮到3.8轮
  • ToEven:3.85轮到3.8轮(这不是大多数人所期望的)
  • 从零开始:3.75轮到3.8轮
  • 从零开始:3.85轮到3.9轮

有关详细信息,请参阅:

数学。如果没有小数点,则舍入将不会添加任何小数点<代码>字符串。格式将更改。
e、 g.:
Math.Round(2)
返回2;
String.Format(“{0:0.00}”,2)
返回2.00

他们不需要是相同的,所以你可能更喜欢<代码>数学。循环< /代码>并使用它的舍入选项,也可以在你把货币存储为一倍的可能性的情况下检查这一点,你应该真正考虑使用十进制。代码>数学。数字>0的四舍五入(双位数)
在概念上是非常不干净的。我认为它永远不应该被使用
double
是一个二进制浮点数,因此没有明确定义的十进制数字概念。如果需要将一个数字四舍五入到一定数量的小数位数,请使用
decimal
,而不是
Double
。请注意,第一个使用“远离零”四舍五入,第二个使用“到偶数”。第二种方法是通过重载指定舍入的类型,但默认情况下是“到偶数”…如果我不是“大多数人”,该怎么办?我可能错了,但我相信@CodesInChaos并不是说人们从不期望。5的舍入,他们只是期望它始终舍入(也就是说,如果3.75四舍五入,那么3.85的行为应该是类似的。@安德烈只需将
中点四舍五入
保留为
ToEven
?我不确定我是否明白你的意思。@Ruben9922,我的观点是,当你坚持使用字符串或字符串.Format时,你没有这个选项,它将总是四舍五入,就像“大多数人期望的那样”。