【问题标题】:Ambiguous call Math.Round ( int64 / int64, int)模棱两可的调用 Math.Round ( int64 / int64, int)
【发布时间】:2014-05-20 15:32:41
【问题描述】:

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

我的实际操作是

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

我也是一个介于 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 系统上),但我的算法似乎没有优化,我想添加一个百分比进度条来了解我的EXE 崩溃与否。我的变量是这个百分比...

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

【问题讨论】:

  • 提示:任何数的最大素因数不能大于其平方根。 (你明白为什么吗?)所以当你得到那个数字的平方根时,你可以停止寻找因子;你不需要一直到号码本身。
  • 还有一个额外的提示:一旦你找到了一个素数,你就可以将你的数字除以那个素数。然后,您只需搜索新的较小数字的平方根。

标签: c# double decimal rounding ambiguous


【解决方案1】:

如果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 重载——但计算是以整数完成的,四舍五入,然后然后转换为十进制!如果您要进行演员表,它必须在 操作数 之一上,而不是在 结果 上。

【讨论】:

  • 当然,OP也可以a = Math.round(i / 6008514751.43, 5);
  • @KrisVandermotten 那不会使用十进制重载。
  • @Magnus 我从没说过会。它将使用double 重载。这有什么问题?
  • 通过修改为 600851475143M 视觉不要通知我错误。我认为这是一个很好的答案。
  • @KrisVandermotten:再次阅读问题。
【解决方案2】:

M 标记数值后,将使其成为十进制值。并为 Round 使用正确的重载。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-11
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    相关资源
    最近更新 更多