歧义调用Math.Round (int64 / int64, int)
本文关键字:int64 int 调用 Math Round 歧义 | 更新日期: 2023-09-27 18:04:10
我想用大数字表示百分比(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);