Objective-C在基本的数学运算中使用纯C语言。
话虽如此,您可以在这个问题的答案中找到所有必要的信息(以及C代码):
如何将浮点数转换为易于阅读的分数?
(特别是包含实际C代码的此答案。)
以下是所述算法的快速C函数封装:
typedef struct {
long nominator;
long denominator;
double error;
} Fraction;
Fraction fractionFromReal(double realNumber, long maxDenominator) {
double atof();
int atoi();
void exit();
long m[2][2];
double startx;
long ai;
startx = realNumber;
m[0][0] = m[1][1] = 1;
m[0][1] = m[1][0] = 0;
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) {
break;
}
realNumber = 1 / (realNumber - (double)ai);
if (realNumber > (double)0x7FFFFFFF) {
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
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"
关于为什么会出现这种情况的一些信息,请参见相关问题的答案:如何将浮点数转换为人类可读的分数?
"main(ac, av) int ac; char ** av; {"
替换为"int main (int ac, const char * av[]) {"
,它应该能正常工作。 - Regexidentmain
更改为convert
并在末尾添加return 0;
,成功解决了问题。谢谢! - Jason