模糊调用Math.Round(int64 / int64,int)

时间:2014-05-20 15:32:42

标签: c# double decimal rounding ambiguous

我想做大号的百分比(int64:600 851 475 143)

我的实际操作是

a = Math.round(i / 600851475143 * 100, 5);

i也是一个介于1和600851475143之间的int64。如果我正确的话,结果将介于0,00000%和100,00000%之间。

但是Visual Studio Express 2013告诉我方法与System.Math.Round(decimal,int)'之间的模糊调用。和' System.Math.Round(double,int)'。

如果说有好的方法是System.Math.Round(decimal,int),即使某些int64在操作中,如何说直观?

奖金: 为了解我的问题,我试图解决ProjectEuler.net的问题3: " 13195的主要因素是5,7,13和29。 数字600851475143的最大主要因素是什么?"

我做了我的方法,它适用于13195.但现在我必须用600851475143(在x64系统上),但我的算法似乎不是optimezed,我想添加百分比进度条,知道我是否EXE崩溃与否。我的变量是这个百分比......

我想要了解Euleur问题3的答案,我只需要解决我的百分比问题...

2 个答案:

答案 0 :(得分:6)

如果i是整数,那么商是零或一,因为整数除以整数总是C#中的整数。你的意思是说

a = Math.round(i / 600851475143.0 * 100.0, 5);

这会强制计算为双精度,或

a = Math.round(i / 600851475143.0m * 100.0m, 5);

强制它以小数表示。

错误消息是正确的 - 整数结果是否应转换为十进制或双精度是不明确的。它没有指出更基本的错误。

顺便说一下,这个错误非常普遍。事实上,我的团队正在研究一种静态分析仪来检测它。现在删除的答案实际上给出了我经常看到的错误形式:

a = Math.round((decimal)(i / 600851475143 * 100), 5);

这消除了歧义 - 显然你的意思是decimal重载 - 但是计算是用整数完成的,四舍五入到整数,然后然后转换成十进制!如果您要进行投射,则必须在其中一个操作数上,而不是在结果上。

答案 1 :(得分:3)

将数字值标记为M后会使其成为小数值。并使用Round的正确重载。

var a = Math.Round(i / 600851475143M * 100, 5);