如何将字符串四舍五入为两位小数?

20

2
你尝试了什么?哪些方法没有成功?请发布你的代码并解释你遇到的困难所在。 - Oded
你想要存储的数字四舍五入,还是只在显示时进行四舍五入?也就是说,小数变量应该存储“0.51667308807373”并显示“0.52”,还是应该存储“0.52”? - Chris
@Binary Worrier:我认为这个问题更多涉及到解析而不是格式化... - Chris
6个回答

43
Math.Round(Convert.ToDecimal(strTemp), 2);

20
首先将字符串转换为十进制数(使用 Decimal.Parse 或 Decimal.TryParse)。
decimal d = Decimal.Parse("123.45678");

然后使用Round(d, m)对小数进行四舍五入,其中d是你的数字,m是小数位数,请参考http://msdn.microsoft.com/en-us/library/6be1edhb.aspx

decimal rounded = Decimal.Round(d, 2); 

如果您只想进行展示性的四舍五入,可以跳过将值舍入到小数位,而是直接在输出中对值进行四舍五入:

string.Format("{0:0.00}", 123.45678m);  

6

将该值转换为浮点数,然后进行四舍五入:

double temp = Double.Parse(strTemp, CultureInfo.InvariantCulture);
temp = Math.Round(temp, 2);

或者,如果您想要结果作为字符串,只需解析并将其格式化为两位小数:

double temp = Double.Parse(strTemp, CultureInfo.InvariantCulture);
string result = temp.ToString("N2", CultureInfo.InvariantCulture);

注意: CultureInfo 对象的作用是使方法始终使用句点作为小数分隔符,而不考虑本地区域设置。

0
var roundedTemp = Math.Round(decimal.Parse(strTemp), 2);

你可能想先检查一下字符串是否始终为十进制,但我认为这就是它的本质。

3
Math.Round 从什么时候开始接受字符串参数了? - Oded
在你的评论之前,我已经快速地进行了第二次检查,解析字符串并不是一个范式跳跃。 ;) - dove
如果代码甚至不能编译,那不算一个好的答案。你认为作者本人能够自己做出这个跨越吗? - Oded
在我看到你的评论之前,我已经编辑了答案。 - dove
这不是范式的飞跃,但它是正确答案的核心部分。 :) - Chris
显示剩余4条评论

0

0

你可以使用数字格式信息,就像这样:

NumberFormatInfo nfi = new CultureInfo("en-US", false).NumberFormat;


double myInt = 0.51667308807373;

// Displays the same value with four decimal digits.
nfi.NumberDecimalDigits = 2;
Console.WriteLine(myInt.ToString("N", nfi));
Console.ReadKey();

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