使用pow()函数生成Decimal时接收NaN作为输出

时间:2017-11-15 07:07:17

标签: swift swift3

我已经在这几个小时了,所以如果我错过了一些明显的东西,请原谅我。

我正在使用pow(_ x: Decimal, _ y: Int) -> Decimal功能来帮助使用基本公式生成每月付款金额。我将此功能链接到infix operator ***,但我尝试使用它只是输入函数并遇到同样的问题。

Xcode昨天因为配方太长而对我大吼大叫,所以我把它分成几个常数并将其纳入我需要的整体配方中。

代码:

precedencegroup PowerPrecedence { higherThan: MultiplicationPrecedence }
infix operator *** : PowerPrecedence
func *** (radix: Decimal, power: Int) -> Decimal {
    return (pow((radix), (power)))
}

func calculateMonthlyPayment() {
        let rateAndMonths: Decimal = ((0.0199 / 12.0) + (0.0199 / 12.0))
        let rateTwo: Decimal = ((1.0+(0.0199 / 12.0)))
        loan12YearsPayment[0] = ((rateAndMonths / rateTwo) *** 144 - 1.0) * ((values.installedSystemCost + loanFees12YearsCombined[0]) * 0.7)

当我打印到控制台或在模拟器中运行它时,输出为NaN。我知道pow函数本身正常工作,因为我已经尝试了随机整数。

1 个答案:

答案 0 :(得分:0)

请为以下Apple功能实现找到我的观点,请注意以下示例:

pow(1 as Decimal, -2) // 1; (1 ^ Any number) = 1 
pow(10 as Decimal, -2) // NAN 
pow(0.1 as Decimal, -2) // 100 
pow(0.01 as Decimal, -2) // 10000 
pow(1.5 as Decimal, -2) // NAN 
pow(0.5 as Decimal, -2) // NAN

似乎,带十进制的pow除了10个基数外,不考虑任何浮点数。所以它处理:

0.1 ^ -2 ==(1/10)^ -2 == 10 ^ 2 //正确计算,以10为基数10、100、1000,...

1.5 ^ -2 ==(3/2)^ -2 //(3/2)是一个浮点数,因此将其视为Double而不是小数,返回NAN。

0.5 ^ -2 ==(1/2)^ -2 //(2)不是10的基数,因此按原样被视为(1/2),它也是一个浮点数。返回NAN。