当通过减去字符的旧权重并为新字符添加新权重来评估字符串的滚动哈希时,会出现这种情况。
Python 具有无限长度的数字,并且能够存储如此大的数字:
num = -56061846576641933068511861128435847024473459936647893758520084401988341 div = 10**9 + 7 mod = num % div #504892002
但在 Swift 中,当我不断进行计算时,我会失去精度并得到越来越大的错误。例如,在我的计算中的某个时刻,上面的数字具有以下值:
var num = Double("-5.606184657664193e+70") var div = pow(Double(10), 9) + 7 var mod = num!.truncatingRemainder(dividingBy: div) mod = mod < 0 ? mod + div : mod //215272131.0
在 Swift 中,使用Double类型可能导致精度损失,特别是对于非常大的Double是一个浮点
Double
为了你的Decimal类型,这是一个非常重要的十轮类型。这将提供更好Double的精度,特别是对于大整数的损伤。以下是 Swift 中使用Decimal类型的示例:
Decimal
import Foundation var num = Decimal(string: "-5.606184657664193e+70")! let div = Decimal(pow(10, 9) + 7) var mod = num.truncatingRemainder(dividingBy: div) mod = mod < 0 ? mod + div : mod print print(mod) // 输出 504892002
请注意,Swift 的Decimal类型是精确的