我需要将双精度值四舍五入到2位小数。
哪种方式更好呢?
String.Format("{0:0.00}", 123.4567); // "123.46"
Math.Round(123.4567, 2) // "123.46"
我需要将双精度值四舍五入到2位小数。
哪种方式更好呢?
String.Format("{0:0.00}", 123.4567); // "123.46"
Math.Round(123.4567, 2) // "123.46"
Math.Round(double, digits)
的概念在理论上非常不清晰。但我认为它应该永远不会被使用。因为 double
是一个二进制浮点数,因此没有明确定义的小数位的概念。
我建议在仅需要进行小数位显示舍入时使用 string.Format
或者 ToString("0.00")
,并且如果需要对实际数字进行舍入(例如在进一步计算中使用)则使用 decimal.Round
。
注意:使用 decimal.Round
可以指定一个MidpointRounding
模式。通常希望使用 AwayFromZero
舍入方式而不是使用 ToEven
(四舍五入)方式。
使用 ToEven
舍入方式时,0.005m
舍入为 0.00
,0.015
舍入为 0.02
。这不是大多数人所期望的。
比较:
更多信息请参见:https://msdn.microsoft.com/en-us/library/system.math.round.aspx
MidpointRounding
保留为ToEven
吗?我不确定您的意思。 - Ruben9922它们是不同的函数,如果需要显示输出,请使用第一个函数(它也会强制小数点出现)。这样可以避免变量为double类型时必然发生的.ToString()开销。
请注意,第二个函数会四舍五入数字,但如果结果是整数,则只会得到整数(例如:7 vs 7.00)
String.Format
将返回一个字符串,Math.Round(double)
将返回一个双精度浮点数。前者输出一个字符串,后者输出一个双精度浮点数。你对结果的使用是什么?这个问题的答案将决定你的问题的答案。
如果你希望将这个值作为一个 string
返回,那么使用 String.Format
更好;如果你希望将这个值作为一个 double
返回,那么使用 Math.Round
更好。完全取决于你的需要。
Math.Round
如果没有小数位,就不会添加任何小数位。而String.Format
则会。
例如:Math.Round(2)
返回2;
String.Format("{0:0.00}",2)
返回2.00;
Math.Round
并使用其舍入选项。另外,请查看此字符串格式化舍入。 - V4VendettaMath.Round(double, digits)
当digits>0时,概念上非常不干净。我认为它不应该被使用。double
是一个二进制浮点数,因此没有明确定义的十进制数字的概念。如果需要将数字四舍五入到特定数量的小数位数,请使用Decimal
而不是Double
。 - CodesInChaos