2012-11-27 68 views
0

我正在计算一些值的平均值。一切正常。 我想要做的是将双数舍入到小数点后第二位。舍入到某个小数位

例如

我会显示为 0.83

0.833333333333333333反正有没有做到这一点?

+1

use string.Format – Zaki

+1

你想得到一个双或字符串? – 888

回答

9

回合double本身喜欢:

Math.Round(0.83333, 2, MidpointRounding.AwayFromZero); 

(你应该定义MidpointRounding.AwayAwayFromZero才能得到正确的结果默认此函数使用银行家四舍五入阅读更多关于银行家四舍五入:。http://www.xbeat.net/vbspeed/i_BankersRounding.htm所以你可以看到为什么这个不会给你正确的结果)

或只为两位小数的显示值:

myDouble.ToString("F"); 

或供的#

myDouble.ToString("#.##") 
+1

默认值是MidPointRounding.ToEven。这与IEEE标准确认。因此它应该被单独留下,即默认值。 –

+1

@MilindThakkar它取决于应用程序 - 我看到一家公司拥有自己的计费系统,需要针对不同的供应商提供不同的舍入方案。无论哪种舍入方法*都可以正确,但这是邓肯知道并选择的方法。 –

+0

它不是*显示*值,并将在0.857失败,将返回0.86和*不* 0.85按OP所要求的: – Tigran

1

数量确定的任何小数你说显示为 - 所以这将是:

var d = value.ToString("f2"); 

Standard numeric format strings

如果你真的要调整值降低到2dp,那么你可以做@middelpat建议的。

1

使用

Math.Round(decimal d,int decimals); 

Math.Round(0.833333333,2); 

这会给你的结果0.83

+0

这并不总是正确的。看看银行家的四舍五入:xbeat.net/vbspeed/i_BankersRounding.htm您应该指定第三个参数MidpointRounding.AwayFromZero – middelpat

+0

@middelpat:标准的方法是.ToEven,这符合IEEE标准。投票不是理由。 –

+0

我没有downvote,只是添加了一条评论。 downvote是别人。 – middelpat

0
double d = 0.833333333333333333; 
Math.Round(d, 2).ToString(); 
+0

这并不总是正确的。看看银行家的四舍五入:http://www.xbeat.net/vbspeed/i_BankersRounding.htm您应该指定第三个参数MidpointRounding.AwayFromZero – middelpat

+1

@middelpat:标准的方法是.toEven,这是按照IEEE标准是正确的。投票不是理由。 –

0

尝试

decimalVar = 0.833333333333333333; 
decimalVar.ToString ("#.##"); 
-1

如果你想看到0.85781..0.85,最简单的方法是通过100倍增,由100转换为int和鸿沟。

int val = (int)(0.833333333333333333 * 100); 
var result = val /100; 

它应该产生你正在寻找的结果。

+2

@dowvoter:原因? – Tigran