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

loc*_*tos 1 c# double decimal rounding ambiguous

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

我的实际操作是

a = Math.round(i / 600851475143 * 100, 5);
Run Code Online (Sandbox Code Playgroud)

我也是一个介于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的问题,我只需要修复我的百分比问题......

Eri*_*ert 6

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

a = Math.round(i / 600851475143.0 * 100.0, 5);
Run Code Online (Sandbox Code Playgroud)

这迫使计算成双打,或

a = Math.round(i / 600851475143.0m * 100.0m, 5);
Run Code Online (Sandbox Code Playgroud)

这迫使它以小数表示.

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

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

a = Math.round((decimal)(i / 600851475143 * 100), 5);
Run Code Online (Sandbox Code Playgroud)

这消除了歧义 - 显然你意味着decimal重载 - 但计算是以整数完成,舍入为整数,然后转换为十进制!如果您要进行演员表演,则必须在其中一个操作数上,而不是在结果上.