Math.Pow(10,Math.Abs​​(1))是否等于10?

时间:2018-03-12 09:46:06

标签: c#

我目前正在维护一位前同事的代码,并找到了以下代码(示例):

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;

1 个答案:

答案 0 :(得分:6)

使用10代替(Math.Pow(10, Math.Abs(1))的唯一区别是类型。如果在代码中编写10,编译器会将该数字视为intMath.Pow但会返回double

有时这会产生影响。例如,如果someValueint,则someValue/10将使用整数除法,因此可能无法达到预期效果。在这种情况下,尽管someValuedouble,因此您将使用浮点除法。

所以,是的,您可以安全地使用Math.Pow替换10来电。

至于为什么它是这样的 - 我经常发现这种代码存在,因为它原本更复杂,然后得到简化。例如,它可能最初类似于Math.Pow(10,precision)或类似需要方法调用的东西。然后有人决定始终使精度1和相应更新,而不实际简化任何可以简化的代码。

实际为什么只是纯粹的推测。如果这是在源代码管理中,可能会有一个提交注释来解释它,如果没有,它可能会让你找到作者并问他们......