C#Math.Round模棱两可的问题

时间:2019-04-25 10:25:10

标签: c#

a,b的类型为bin/console debug:container

long

以下方法或属性之间的调用不明确:Math.Round(a/b, (int)2) System.Math.Round(double, int)

如何告诉编译器第二个参数是System.Math.Round(double, System.MidpointRounding)而不是int

编辑1:由于某种原因,如果我独立运行以上代码,则会收到错误消息 “ System.MidpointRounding “但是我的原始代码作为长脚本的一部分运行,其中a,b是隐式类型的中间变量,并为我提供了上述令人困惑的错误消息。

有两个正确答案:

  1. 使用命名参数,即Error CS0121 The call is ambiguous between the following methods or properties: 'Math.Round(double, int)' and 'Math.Round(decimal, int)' [感谢colinB的评论]
  2. 转换为两倍(尽管从原始错误来看这并不明显 消息),即Math.Round(a/b, digits: 2) [由于Owen Pauling的回答]

2 个答案:

答案 0 :(得分:3)

您的问题有几处错误。在编辑之前,它显示了两个属性被划分以产生Math.Round的第一个参数。我希望这些值是整数,因此您的结果不是整数,而是整数。整数可以隐式转换为双精度或十进制。这导致了该问题的第二个问题,即模棱两可的重载是System.Math.Round( decimal ,System.MidpointRounding)。基本上,编译器不知道您是使用双精度还是十进制调用重载。

您可以通过确保除法结果为两倍来解决此问题,例如:

Math.Round(val1/(double)val2, 2);

答案 1 :(得分:0)

Owen Pauling 简单地谈到了这个问题,但我觉得未来的读者需要多加注意:

当 a 和 b 都是整数类型(在您的情况下为 long)时,除法本身的结果已经是一个整数(隐式向零舍入)。这已经发生在调用 Math.Round 之前,这对于在这里完成您似乎想要的还为时过早。

所以基本上你是要求将一个整数四舍五入到一个整数,这当然没有意义。这就是为什么没有 Math.Round 需要整数类型的数字,这就是为什么它需要强制转换并且不知道要强制转换为什么。

总结:这看起来像是一个常见的错误。你不是在要求你认为你要求的东西,舍入不会像你想要的那样表现,除非你在除法之前转换为你选择的非整数类型,像这样: >

double correct1 = Math.Round(a / (double)b, 2); // Owen Pauling's answer
decimal correct2 = Math.Round(a / (decimal)b, 2);

但不要像这样简单地规避编译错误:

double inCorrect1 = Math.Round(a / b, digits: 2); // colinB's answer
decimal inCorrect2 = Math.Round(a / b, decimals: 2);

(注意:因为强制转换比除法具有更高的优先级,所以无论您是使用被除数还是除数都没有关系。我更喜欢使用除数,因为它使强制转换在除法之前执行在视觉上很明显。)< /p>

相关问题