Cómo detectar un decimal que se repite

Necesito detectar un cociente infinito. Por ejemplo, cuando el usuario divide 1/3, no voy a mostrarle 0.333333333333, voy a mostrarle que el resultado es un decimal que se repite.

Aquí hay una posible implementación de cómo calcular la expansión decimal de una fracción y detectar decimales repetitivos (es decir, períodos en la expansión decimal). Es una traducción del código publicado y revisado en Expansión decimal de un número racional en Revisión de código a Swift.

El algorithm es solo la split larga , y una matriz ( remainders ) se usa para verificar una expansión decimal periódica. (En aras de la simplicidad, se supone que el numerador no es negativo y el denominador es positivo. Esto puede generalizarse si es necesario).

 struct DecimalFraction : Printable { let wholePart : Int // Integer part let fractionDigits : [Int] // Fractional digits let repeatingAt : Int? // Position of first repeating digit, or `nil` // Create DecimalFraction from given fraction init(numerator : Int, denominator : Int) { precondition(numerator >= 0, "`numerator` must be non-negative") precondition(denominator > 0, "`denominator` must be positive") wholePart = numerator / denominator var fractionDigits : [Int] = [] var repeatingAt : Int? = nil var rem = (abs(numerator) % denominator) * 10 var remainders : [Int] = [] while (rem > 0 && repeatingAt == nil) { remainders.append(rem) let digit = rem / denominator rem = (rem % denominator) * 10 fractionDigits.append(digit) repeatingAt = find(remainders, rem) } self.fractionDigits = fractionDigits self.repeatingAt = repeatingAt } // Produce a string description, eg "12.3{45}" var description : String { var result = String(wholePart) + "." for (idx, digit) in enumerate(fractionDigits) { if idx == repeatingAt { result += "{" } result += String(digit) } if repeatingAt != nil { result += "}" } return result } } 

Ejemplos:

 println(DecimalFraction(numerator: 3, denominator: 8)) // 0.375 println(DecimalFraction(numerator: 1, denominator: 3)) // 0.{3} println(DecimalFraction(numerator: 20, denominator: 7)) // 2.{857142} println(DecimalFraction(numerator: 12222, denominator: 990)) // 12.3{45} 

Los periodos simplemente se indican con llaves, pero debería ser fácil modificar el código para producir un NSAttributedString que indique los períodos, por ejemplo, líneas horizontales.