我目前正在维护一位前同事的代码,并找到了以下代码(示例):
double someValue = 20, someResult;
someResult = (Convert.ToInt32(Math.Round(someValue / (Math.Pow(10, Math.Abs(1))), MidpointRounding.AwayFromZero) * Math.Pow(10, Math.Abs(1))) + 10) - someValue;
我想知道为什么他使用Math.Pow(10, Math.Abs(1))
代替10
?
是因为不准确还是某种形式?
如果代码更改为:
,结果相同someResult = (Math.Round(someValue / 10, MidpointRounding.AwayFromZero) * 10 + 10) - someValue;
答案 0 :(得分:6)
使用10
代替(Math.Pow(10, Math.Abs(1))
的唯一区别是类型。如果在代码中编写10
,编译器会将该数字视为int
。 Math.Pow
但会返回double
。
有时这会产生影响。例如,如果someValue
是int
,则someValue/10
将使用整数除法,因此可能无法达到预期效果。在这种情况下,尽管someValue
是double
,因此您将使用浮点除法。
所以,是的,您可以安全地使用Math.Pow
替换10
来电。
至于为什么它是这样的 - 我经常发现这种代码存在,因为它原本更复杂,然后得到简化。例如,它可能最初类似于Math.Pow(10,precision)
或类似需要方法调用的东西。然后有人决定始终使精度1和相应更新,而不实际简化任何可以简化的代码。
实际为什么只是纯粹的推测。如果这是在源代码管理中,可能会有一个提交注释来解释它,如果没有,它可能会让你找到作者并问他们......