为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
暮色呼如 2022-12-31 10:47:30
a,b 属于类型longMath.Round(a/b, (int)2)以下方法或属性之间的调用不明确:System.Math.Round(double, int)和System.Math.Round(double, System.MidpointRounding)如何告诉编译器第二个参数是int不是System.MidpointRounding?编辑 1:出于某种原因,如果我单独运行上面的代码,我会收到错误“ Error CS0121  The call is ambiguous between the following methods or properties: 'Math.Round(double, int)' and 'Math.Round(decimal, int)' ”,但我的原始代码作为长脚本的一部分运行,其中 a、b 是隐式类型的中间变量,并给我上面令人困惑的错误消息。有两个正确答案:使用命名参数即Math.Round(a/b, digits: 2)[感谢 colinB 的评论]强制转换为 double(虽然这从原始错误消息中并不明显)即Math.Round((double)a/b, 2)[感谢 Owen Pauling 的回答]
查看完整描述

2 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

你的问题有几个问题。在编辑之前,它显示了两个属性被划分以产生第一个参数Math.Round。我希望这些值是整数,因此您的结果不是双精度值,而是整数。整数可以隐式转换为双精度或小数。这就引出了问题的第二个问题,就是有歧义的重载是System.Math.Round( decimal ,System.MidpointRounding)。基本上,编译器不知道你是用双精度还是小数调用重载。

您可以通过确保除法的结果是双精度来解决此问题,例如:

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


查看完整回答
反对 回复 2022-12-31
?
HUX布斯

TA贡献1876条经验 获得超6个赞

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);

(注意:因为转换的优先级高于除法,所以转换被除数还是除数都没有关系。我更喜欢转换除数,因为它在视觉上明显地表明转换是在除法之前执行的。)


查看完整回答
反对 回复 2022-12-31
  • 2 回答
  • 0 关注
  • 259 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信