歧义调用Math.Round (int64 / int64, int)



我想用大数字表示百分比(int64: 600 851 475 143)

我的实际操作是

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

i也是1到600851475143之间的int64。如果我是对的,结果将在0,000%到100,000%之间。

但是Visual Studio Express 2013告诉我方法之间的模糊调用System.Math。四舍五入(十进制,整型)'和'System.Math. '(双,int)。

如何说可视化的好方法是System.Math。四舍五入(decimal, int),即使操作中有int64 ?

奖金:为了理解我的问题,我试图解决ProjectEuler.net的问题3:13195的质因数是5、7、13和29。600851475143的最大质因数是多少?"

我做了我的方法,它适用于13195。但是现在我必须使用600851475143(在x64系统上),但我的算法似乎没有得到优化,我想添加一个百分比进度条来知道我的EXE是否崩溃。我的变量是这个百分比…

我不想要欧拉问题3的答案,我只需要解决我的百分比问题…

如果i是整数,则商为0或1,因为在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重载——但是计算是以整数进行的,四舍五入为整数,然后然后转换为十进制!如果要进行强制转换,必须在操作数之一上,而不是在结果上。

在数值后面加上M将使其变为十进制值。为Round.

使用正确的重载
var a = Math.Round(i / 600851475143M * 100, 5);