小能豆

如何在 Swift 中对大数进行模运算?

python

当通过减去字符的旧权重并为新字符添加新权重来评估字符串的滚动哈希时,会出现这种情况。

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

阅读 54

收藏
2023-11-14

共1个答案

小能豆

在 Swift 中,使用Double类型可能导致精度损失,特别是对于非常大的Double是一个浮点

为了你的Decimal类型,这是一个非常重要的十轮类型。这将提供更好Double的精度,特别是对于大整数的损伤。以下是 Swift 中使用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类型是精确的

2023-11-14