2 回答
TA贡献1827条经验 获得超4个赞
你的问题有几个问题。在编辑之前,它显示了两个属性被划分以产生第一个参数Math.Round
。我希望这些值是整数,因此您的结果不是双精度值,而是整数。整数可以隐式转换为双精度或小数。这就引出了问题的第二个问题,就是有歧义的重载是System.Math.Round( decimal ,System.MidpointRounding)。基本上,编译器不知道你是用双精度还是小数调用重载。
您可以通过确保除法的结果是双精度来解决此问题,例如:
Math.Round(val1/(double)val2, 2);
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);
(注意:因为转换的优先级高于除法,所以转换被除数还是除数都没有关系。我更喜欢转换除数,因为它在视觉上明显地表明转换是在除法之前执行的。)
- 2 回答
- 0 关注
- 259 浏览
添加回答
举报