¿Convertir decimal a fracción en Objective-C?

Estoy tratando de tomar todo después del decimal y mostrarlo como una fracción. No se pudo encontrar mucho para el objective c sobre cómo lograr esto. Estoy utilizando el double para mi formato de variables, no estoy seguro de si importaría o no. Así es como estoy formateando para el resultado de mi respuesta: [theTextField setText:[NSString stringWithFormat:@"%f''", (myVariable)]]; Esto se muestra bien como decimal, pero realmente me gustaría como un número entero y fracción (es decir) 7 1/2 en vez de 7.5000. ¡Gracias por adelantado!

Actualización: 13/05/2011

Bueno, tengo que mostrar 7 1/16, pero algo con las matemáticas está apagado. Porque no cambiará de 1/16 incluso cambiando los valores que se dividen. ¿Dónde me estoy equivocando aquí? Si alguien puede hacer que esto funcione correctamente, publique cómo se hace. Esto es algo que debería ser simple, pero no lo es y consume mucho tiempo. Por favor, publique cómo se hace. Gracias.

Actualización: si esta respuesta no funciona para que revises mi otra publicación, ¡esto funciona! Convierte decimales a fracciones

Objective-C usa C pura para básicamente todas las operaciones matemáticas primitivas.

Dicho esto, encontrará toda la información necesaria (junto con el código C) en las respuestas de esta otra pregunta:

¿Cómo convertir flotadores a fracciones legibles por humanos?

(Específicamente esta respuesta presenta un código C real).

Aquí hay una envoltura de función c rápida de dicho algoritmo:

 typedef struct { long nominator; long denominator; double error; } Fraction; /* * Find rational approximation to given real number * David Eppstein / UC Irvine / 8 Aug 1993 * * With corrections from Arno Formella, May 2008 * Function wrapper by Regexident, April 2011 * * usage: fractionFromReal(double realNumber, long maxDenominator) * realNumber: is real number to approx * maxDenominator: is the maximum denominator allowed * * based on the theory of continued fractions * if x = a1 + 1/(a2 + 1/(a3 + 1/(a4 + ...))) * then best approximation is found by truncating this series * (with some adjustments in the last term). * * Note the fraction can be recovered as the first column of the matrix * ( a1 1 ) ( a2 1 ) ( a3 1 ) ... * ( 1 0 ) ( 1 0 ) ( 1 0 ) * Instead of keeping the sequence of continued fraction terms, * we just keep the last partial product of these matrices. */ Fraction fractionFromReal(double realNumber, long maxDenominator) { double atof(); int atoi(); void exit(); long m[2][2]; double startx; long ai; startx = realNumber; // initialize matrix: m[0][0] = m[1][1] = 1; m[0][1] = m[1][0] = 0; // loop finding terms until denom gets too big: while (m[1][0] * (ai = (long)realNumber) + m[1][1] < = maxDenominator) { long t; t = m[0][0] * ai + m[0][1]; m[0][1] = m[0][0]; m[0][0] = t; t = m[1][0] * ai + m[1][1]; m[1][1] = m[1][0]; m[1][0] = t; if (realNumber == (double)ai) { // AF: division by zero break; } realNumber = 1 / (realNumber - (double)ai); if (realNumber > (double)0x7FFFFFFF) { // AF: representation failure break; } } ai = (maxDenominator - m[1][1]) / m[1][0]; m[0][0] = m[0][0] * ai + m[0][1]; m[1][0] = m[1][0] * ai + m[1][1]; return (Fraction) { .nominator = m[0][0], .denominator = m[1][0], .error = startx - ((double)m[0][0] / (double)m[1][0]) }; } 

Llamándolo así:

 double aReal = 123.45; long maxDenominator = 42; Fraction aFraction = fractionFromReal(aReal, maxDenominator); printf("Real %.3f -> fraction => %ld/%ld, error: %.3f\n", aReal, aFraction.nominator, aFraction.denominator, aFraction.error); 

Imprime esto:

 Real 123.450 -> fraction => 3827/31, error: -0.002 

Por último, pero no por eso menos importante, veamos cómo sacamos nuestra fracción recién creada a nuestro campo de texto:

 double myVariable = 7.5; long maxDenominator = 1000; //sample value Fraction myFraction = fractionFromReal(abs(myVariable - (NSInteger)myVariable), maxDenominator); [theTextField setText:[NSString stringWithFormat:@"%d %d/%d", (NSInteger)myVariable, myFraction.nominator, myFraction.denominator]]; 

Salida esperada: "7 1/2" , salida real: "7 499/999"
Para obtener información sobre por qué esto puede suceder, vea esta respuesta a una pregunta relacionada: ¿Cómo convertir flotadores a fracciones legibles por humanos?

He escrito un código para convertir decimal a su fracción más baja posible. Esto funciona perfectamente bien

 -(int)gcdForNumber1:(int) m andNumber2:(int) n { while( m!= n) // execute loop until m == n { if( m > n) m= m - n; // large - small , store the results in large variable
else n= n - m; } return ( m); // m or n is GCD } -(int)tenRaisedTopower:(int)decimalLength { int answer = 10; while (decimalLength!= 1) { answer *= 10; decimalLength -- ; } return answer; } -(void)floatToFraction:(float)decimalNumber { NSString *decimalString = [NSString stringWithFormat:@"%f", decimalNumber]; NSArray *components = [decimalString componentsSeparatedByString:@"."]; int decimalLength = [[components objectAtIndex:1] length]; int n = [self tenRaisedTopower:decimalLength]; int m = [[components objectAtIndex:1] intValue]; int gcd = [self gcdForNumber1:m andNumber2:n]; int numer = m/gcd; int deno = n/gcd; int fractionnumer = ([[components objectAtIndex:0] intValue] * deno) + numer; NSLog(@"answer>>%d/%d", fractionnumer, deno); }

llamar al método como:

 [self floatToFraction:2.5];