使用 Xcode 11.1 如果我运行一个操场:
pow(10 as Double, -2) // 0.01
Run Code Online (Sandbox Code Playgroud)
我使用 Float 得到相同的输出:
pow(10 as Float, -2) // 0.01
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试使用 pow(Decimal, Int) 如下所示:
pow(10 as Decimal, -2) // NaN
Run Code Online (Sandbox Code Playgroud)
有人知道为什么吗?
有没有更好的方法来处理 pow 和 Decimal 的正负指数?我需要十进制,因为它们的行为与我对货币价值的期望一样。
编辑:我知道如何从数学的角度解决这个问题,我想了解它为什么会发生和/或它是否可以在不增加我的代码的圈复杂度的情况下解决(例如检查指数是否为负并执行 1 /战俘)
我不确定我在做什么错。如果您在Xcode Playground(我使用的是11.1)中运行此代码,您会发现它在随机日期上失败,在我的系统中,该日期恰好是添加到当前日期后6500天之后的某个日期。但是这些日期不是固定的。
(1...10000).forEach { days in
let calendar = Calendar(identifier: .gregorian)
var dayComponent = DateComponents()
dayComponent.day = days
let date = Date()
let someFutureDate = calendar.date(byAdding: dayComponent, to: date)!
let difference = calendar.dateComponents([.day], from: date, to: someFutureDate)
if (days != difference.day!) {
print("WAT \(date) - \(someFutureDate) \(days) \(difference.day!)")
}
}
Run Code Online (Sandbox Code Playgroud)
一些输出(在我的测试中从130到160次失败,输出有所不同):
WAT 2019-10-31 14:01:47 +0000 - 2038-01-21 14:01:47 +0000 6657 6656
WAT 2019-10-31 14:01:47 +0000 - 2038-01-26 14:01:47 +0000 6662 6661
WAT 2019-10-31 14:01:47 +0000 - 2038-02-02 14:01:47 +0000 6669 …Run Code Online (Sandbox Code Playgroud)