Objective c 在目标C中,将小数转换为分数(有理数)?
作为计算器应用程序的一部分,我正在尝试使用西格玛符号来实现使用。然而,它打印出来的结果总是一个小数,其余的并不重要。我只想把小数改成小数 我已经有了reduce函数,我遇到的问题是从一个像这样的小数点:'0.96875'到它的小数点,'31/32' 谢谢 附言:我已经调查了几乎所有的事情,就我的一生而言,我无法理解这一点。在这一点上,我需要的是如何去掉小数点,然后我可以减少它 以下是我的reduce方法:Objective c 在目标C中,将小数转换为分数(有理数)?,objective-c,math,rational-numbers,Objective C,Math,Rational Numbers,作为计算器应用程序的一部分,我正在尝试使用西格玛符号来实现使用。然而,它打印出来的结果总是一个小数,其余的并不重要。我只想把小数改成小数 我已经有了reduce函数,我遇到的问题是从一个像这样的小数点:'0.96875'到它的小数点,'31/32' 谢谢 附言:我已经调查了几乎所有的事情,就我的一生而言,我无法理解这一点。在这一点上,我需要的是如何去掉小数点,然后我可以减少它 以下是我的reduce方法: -(void)reduce { int u = numerator;
-(void)reduce {
int u = numerator;
int v = denominator;
int temp;
while (v != 0) {
temp = u % v;
u = v;
v = temp;
}
numerator /= u;
denominator /= u;
}
这是我自己发现的。我所做的是将分子和分母乘以1000000(回想一下小数点看起来像.96875/1),这样它看起来像
96875/100000
然后,我使用这个reduce方法将其降到最低:
-(void)reduce {
int u = numerator;
int v = denominator;
int temp;
while (v != 0) {
temp = u % v;
u = v;
v = temp;
}
numerator /= u;
denominator /= u;
}
最后,我使用打印方法将其转换为分数形式:
//In the .h
@property int numerator, denominator, mixed;
-(void)print;
//In the .m
@synthesize numerator, denominator, mixed;
-(void)print {
if (numerator > denominator) {
//Turn fraction into mixed number
mixed = numerator/denominator;
numerator -= (mixed * denominator);
NSLog(@"= %i %i/%i", mixed, numerator, denominator);
} else if (denominator != 1) {
//Print fraction normally
NSLog(@"= %i/%i", numerator, denominator);
} else {
//Print as integer if it has a denominator of 1
NSLog(@"= %i", numerator);
}
}
得到了我想要的结果:
31/32
这是我自己发现的。我所做的是将分子和分母乘以1000000(回想一下小数点看起来像.96875/1),这样它看起来像
96875/100000
然后,我使用这个reduce方法将其降到最低:
-(void)reduce {
int u = numerator;
int v = denominator;
int temp;
while (v != 0) {
temp = u % v;
u = v;
v = temp;
}
numerator /= u;
denominator /= u;
}
最后,我使用打印方法将其转换为分数形式:
//In the .h
@property int numerator, denominator, mixed;
-(void)print;
//In the .m
@synthesize numerator, denominator, mixed;
-(void)print {
if (numerator > denominator) {
//Turn fraction into mixed number
mixed = numerator/denominator;
numerator -= (mixed * denominator);
NSLog(@"= %i %i/%i", mixed, numerator, denominator);
} else if (denominator != 1) {
//Print fraction normally
NSLog(@"= %i/%i", numerator, denominator);
} else {
//Print as integer if it has a denominator of 1
NSLog(@"= %i", numerator);
}
}
得到了我想要的结果:
31/32
不久前我找到了一个相当好的方法,尽管我不记得是从哪里来的。无论如何,它是这样递归工作的(这是伪代码,不是C): 或者更复杂的例子,1.55:
i = 1
j = 0.55
m/n = getRational(1.81818181)
i = 1
j = 0.81818181
m/n = getRational(1.22222222)
i = 1
j = 0.22222222
m/n = getRational(4.5)
i = 4
j = 0.5
m/n = getRational(2)
i = 2
j = 0
return 2/1
m/n = 2/1
return ((4*2)+1)/2 = 9/2
m/n = 9/2
return ((1*9)+2)/9 = 11/9
m/n = 11/9
return ((1*11)+9)/11) = 20/11
m/n = 20/11
return ((1*20)+11)/20 = 31/20
我用PI试过一次。它会持续一段时间,但如果您将阈值设置为0.01,它只会在返回355/113之前下降几次递归
这里有一个小问题,如果它返回时陷得太深,你可能会得到太大的整数;除了将精度阈值设置为相当宽松的值(如0.01)之外,我还没有真正研究过一种考虑这一点的好方法。不久前,我找到了一种相当好的方法,尽管我不记得是从哪里来的。无论如何,它是这样递归工作的(这是伪代码,不是C): 或者更复杂的例子,1.55:
i = 1
j = 0.55
m/n = getRational(1.81818181)
i = 1
j = 0.81818181
m/n = getRational(1.22222222)
i = 1
j = 0.22222222
m/n = getRational(4.5)
i = 4
j = 0.5
m/n = getRational(2)
i = 2
j = 0
return 2/1
m/n = 2/1
return ((4*2)+1)/2 = 9/2
m/n = 9/2
return ((1*9)+2)/9 = 11/9
m/n = 11/9
return ((1*11)+9)/11) = 20/11
m/n = 20/11
return ((1*20)+11)/20 = 31/20
我用PI试过一次。它会持续一段时间,但如果您将阈值设置为0.01,它只会在返回355/113之前下降几次递归
这里有一个小问题,如果它返回时陷得太深,你可能会得到太大的整数;除了将精度阈值设置为相当宽松的值(如0.01)之外,我还没有找到一种好的方法来实现这一点。尝试以下方法:
-(NSString *)convertToFraction:(CGFloat)floatValue{
double tolerance = 1.0E-6;
CGFloat h1 = 1;
CGFloat h2 = 0;
CGFloat k1 = 0;
CGFloat k2 = 1;
CGFloat b = floatValue;
do{
CGFloat a = floor(b);
CGFloat aux = h1;
h1 = a*h1+h2;
h2 = aux;
aux = k1;
k1 = a*k1+k2;
k2 = aux;
b = 1/(b-a);
}while (ABS(floatValue-h1/k1) > floatValue*tolerance) ;
return k1 > 1 ? [NSString stringWithFormat:@"%.0f/%.0f",h1,k1] : [NSString stringWithFormat:@"%.0f",h1];
}
试试这个:
-(NSString *)convertToFraction:(CGFloat)floatValue{
double tolerance = 1.0E-6;
CGFloat h1 = 1;
CGFloat h2 = 0;
CGFloat k1 = 0;
CGFloat k2 = 1;
CGFloat b = floatValue;
do{
CGFloat a = floor(b);
CGFloat aux = h1;
h1 = a*h1+h2;
h2 = aux;
aux = k1;
k1 = a*k1+k2;
k2 = aux;
b = 1/(b-a);
}while (ABS(floatValue-h1/k1) > floatValue*tolerance) ;
return k1 > 1 ? [NSString stringWithFormat:@"%.0f/%.0f",h1,k1] : [NSString stringWithFormat:@"%.0f",h1];
}
我认为目标是“字符串表示”,尽管表示分数的数据类型的名称通常是“Rational”(请参阅)。使用它可能有助于优化搜索,例如,google给我的是一个带有
initWithDouble
。这里有一个相关的问题:这说明了如何用C来完成。然而,我不是作为一个复制品结束,因为可能有一个“更Obj-C的方式”。然而,对于链接,公认的答案是相当不错的。在提问之前,我研究了上述问题,这正是我提出问题的原因,我希望看到一种“更为obj-c的方式”,我认为目标是“字符串表示法”,尽管表示分数的数据类型的名称通常是“有理的”(请参阅)。使用它可能有助于优化搜索,例如,google给我的是一个带有initWithDouble
。这里有一个相关的问题:这说明了如何用C来完成。然而,我不是作为一个复制品结束,因为可能有一个“更Obj-C的方式”。然而,被接受的答案是很好的链接。我在提问之前研究了上述问题,这正是我提问的原因,我希望看到一种“更加obj-c的方式”