2016-05-31 71 views
-1

这里是我想要做的事:C#Math.Round很长的双 - 不工作

double result = Math.Pow((1 + 8), 60) - 1; 

而结果变量是: 1.7970102999144311E + 57

,并试图于:

Math.Round(result, 5); 

返回相同的:1.7970102999144311E + 57双 我想将它四舍五入到1.79701例如

任何解决方案?

+2

将数字舍入为一个整数。你想要我们的重要人物,而不是四舍五入。 –

+0

@WaiHaLee如果您在不传递数字的情况下使用重载'Math.Round(value)''',Math.Round'只能四舍五入为整数。否则,它肯定*不会*整数 - 整数到指定的位数。 – Rob

回答

1

您误解了您所看到的内容。

1.7970102999144311E+57 

是对

1797010299914431100000... (with 41 trailing zeros). 

这是一个整数科学记数法,因此四舍五入到5位小数将正确返回相同的值。

你想要做的是什么格式返回1.79701E+57数量

String.Format(CultureInfo.InvariantCulture, "{0:0.#####E+0}", result); 

的输出。请注意,这是一个1.79701不同的数字

+1

我想我对这个科学符号不是很熟悉,在第一个时刻它将我看作是一个十进制数字,但是当我再次查看这个数字时,你似乎是正确的。现在对我来说很清楚,我知道接下来需要做的是什么,谢谢。 –

1

您遇到的问题是Math.Round将小数点右侧的内容舍入。例如,如果你正在处理的货币,你执行你留下$ 1.5234524的操作,您可以使用:

Math.Round(1.5234524,2); 
// output 1.52 

你处理的数量实际上是科学记数法的一个非常大的数字有没有什么小数点的权利。这就是Math.Round的结果与输入相同的原因。

0

较早的评论和答案是正确的。但要获得您正在尝试实现的内容,您可以使用以下内容:

double result = Math.Pow((1 + 8), 60) - 1; 
string s = String.Format("{0:E5}", result); 
double d = Double.Parse(s); 
+0

结果仍然是:1.79701E + 57!?任何想法如何摆脱这种无用(在我的情况下)科学记数法? –

+0

'string s = String.Format(“{0:E5}”,result).Substring(0,7);' –

+0

有点“肮脏”的解决方法,但仍然有效,谢谢@Clay Ver Valen –