Преобразовать десятичную дробную часть в Objective-C?

Я пытаюсь взять все после десятичной дроби и показать ее как часть. Не удалось найти много для цели-c о том, как это сделать. Я использую double для форматирования переменных, но не уверен, что это имеет значение или нет. Вот как я форматирую для вывода моего ответа: [theTextField setText:[NSString stringWithFormat:@"%f''", (myVariable)]]; Это отображает ok как десятичное, но ему действительно понравится целое число и дробь (т. Е.) 7 1/2 вместо 7.5000. Заранее благодарю!

Обновление: 5/13/2011

Ну, я получил его для отображения 7 1/16, но что-то с математикой отключено. Потому что он не изменится с 1/16, даже изменив значения, которые становятся разделенными. Где я здесь не так? Если кто-то действительно может заставить это работать, пожалуйста, напишите полностью, как это делается. Это то, что должно быть простым, но не слишком и слишком трудоемким. Пожалуйста, полностью опубликуйте, как это делается. Благодарю.

Обновление: если этот ответ не работает для вас, посмотрите мой другой пост, это работает! Преобразование десятичных дробей в дроби

Objective-C использует чистый C для всех примитивных математических операций.

При этом вы найдете всю необходимую информацию (вместе с кодом C) в ответах на этот другой вопрос:

Как конвертировать поплавки в читаемые человеком фракции?

(В частности, этот ответ содержит фактический код C ).

Вот быстрая c-функция обертки указанного алгоритма:

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

Вызвав это так:

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

Печатает это:

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

И последнее, но не менее важное: посмотрим, как мы получим нашу недавно обработанную фракцию в текстовое поле:

 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]]; 

Ожидаемый результат: "7 1/2" , фактический вывод: "7 499/999"
Для получения информации о том, почему это может произойти, см. Этот ответ на соответствующий вопрос: как конвертировать поплавки в удобочитаемые человеческие фракции?

Я написал код для преобразования десятичной дробной части в ее минимально возможную долю. Это работает отлично.

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

вызов метода:

 [self floatToFraction:2.5]; 
  • Используйте пользовательский разделитель тысяч в C #
  • Изменение шрифта для richtextbox без потери форматирования
  • Формат номера до 2 знаков после запятой
  • Форматирование DATE в oracle
  • Преобразование ISO 8601 в NSDate
  • java: конвертировать float в String и String для float
  • Форматировать двойное значение в научной нотации
  • Преобразовать java.util.Date в строку
  • Как отформатировать TimeSpan в XAML
  • Получение даты с на несколько часов
  • Формат TimeSpan более 24 часов
  • Давайте будем гением компьютера.