我正在寻找什么:
给出一个双精度数(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
}
答案 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) }