有什么方法可以迭代Swift 4中双重VAL的小数部分



我要寻找的是:

给出了双(二倍数字(和一个int(n(,我希望迭代第一个十进制的小数,第二个十进制十进制,第三小数,第4个小数。...直到'n'decimal

我的第一种方法是,覆盖了双重的双重字符串,以便我可以像数组一样迭代字符串,但是问题是当我转换为字符串时,我丢失了许多小数号

    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/98.0的许多十进制数字的意图,则首先不得将该数字存储在Double中,因为这具有精度仅大约16位小数位数。您可以使用Decimal的精度为38个十进制数字。

但是,对于更多的小数位数

这是您可以任意打印有理数数字的许多十进制数字的方法。为了简单起见

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) }

最新更新