有没有办法在swift 4中迭代double var的小数部分?

时间:2019-06-28 16:38:51

标签: ios swift iteration double decimal

我正在寻找什么:

给出一个双精度数(doublenumber)和一个整数(n),我希望遍历小数点后1位,2位小数,3位小数,4位小数....直到'n'位小数

我的第一种方法是,将Double覆盖为String,以便像字符串数组一样进行迭代,但是问题是,当我转换为字符串时,会丢失许多小数位数

    let doubleNumber = 1.00/98                  //0.010204081632653061224489795918367346938775510204081632653...
    var stringFromDouble = String(doubleNumber) //0.010204081632653
    stringFromDouble.removeFirst()              //.010204081632653
    stringFromDouble.removeFirst()              //010204081632653

    for letter in stringFromDouble{
      //cycle to iterate the decimals
    }

1 个答案:

答案 0 :(得分:3)

如果要获取1.0/98.0许多个十进制数字,则您不能首先将该数字存储在Double中,因为它的精度为仅约16个十进制数字。您可以使用精度为38个十进制数字的Decimal

但是对于更多的十进制数字,您将必须执行“有理算术”,即,将分数的分子和分母作为 integers。

在这里,您可以任意打印有理数的许多十进制数字。为简单起见,我假设该数字为正且小于1。

func printDecimalDigits(of numerator: Int, dividedBy denominator: Int, count: Int) {
    var numerator = numerator
    for _ in 1...count {
        // Multiply by 10 to get the next digit:
        numerator *= 10
        // Print integer part of `numerator/denominator`:
        print(numerator / denominator, terminator: "")
        // Reduce `numerator/denominator` to its fractional part:
        numerator %= denominator
    }
    print()
}

示例:

printDecimalDigits(of: 1, dividedBy: 98, count: 100)
// 0102040816326530612244897959183673469387755102040816326530612244897959183673469387755102040816326530

或作为将数字返回(延迟计算)序列的函数:

func decimalDigits(of numerator: Int, dividedBy denominator: Int) -> AnySequence<Int> {
    return AnySequence(sequence(state: numerator) { num -> Int in
        num *= 10
        let d = num / denominator
        num %= denominator
        return d
    })
}

示例:

let first1000Digits = decimalDigits(of: 1, dividedBy: 98).prefix(1000)
for d in first1000Digits { print(d) }