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

问题描述 投票:0回答:1

我已经呆了几个小时,如果我遗漏了一些明显的东西,请原谅我。

我正在使用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函数本身可以正常工作,因为我已经使用随机整数对其进行了尝试。

swift swift3
1个回答
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。

© www.soinside.com 2019 - 2024. All rights reserved.