find一个浮点数的分子的分子,给出一个具体的分母

可能重复:
如何将浮动转换为可读的分数?
在Objective-C中将小数转换为小数?

我想取一个小数, 5.50 ,这是一个variables,并且只将小数部分除以0.0625 ,这是我的准确点。 这将给我8 ,如8/161/2

然后,我想在文本字段中显示该答案为5 8/161/2 。 我知道一些答案会返回一个十进制数,而不是一个整数,除以.0625 ,但我会围绕这个答案,这仍然会给我最接近的十六。 什么是最好的方法来做到这一点? 我想做一个function,所以我可以重用它。 是的,我发布了一个类似的问题,但是没能解决问题。 我想有一个更好,更简单的方法来做到这一点,所以我已经发布了这个。 提前致谢。

function:

 - (NSString *)theFunction:(float)input { NSArray * array = [NSarray initWithObjects:nil,nil@"1/8",nil,@"1/4",] int fractions = lroundf((input - (int)input)/((float)1/(float)16)); if(fractions == 0 || fractions == 16) { return [NSString stringWithFormat:@"%d",lroundf(input)]; } else { return [NSString stringWithFormat:@"%d %d/16",(int)input,fractions]; } } 

注意:

if语句将5 0/16转换为55 16/16转换为6
如果您更喜欢5 0/165 16/16表示法,请将if语句replace为:

 return [NSString stringWithFormat:@"%d %d/16",(int)input,fractions]; 

编辑:( 贾森)

 //Just to make it a little sweeter! - (NSString *)theFunction:(float)input { int fractions = lroundf((input - (int)input)/((float)1/(float)16)); if(fractions == 0 || fractions == 16) { return [NSString stringWithFormat:@"%d",lroundf(input)]; } else if(fractions == 2) { return [NSString stringWithFormat:@"%d 1/8",(int)input]; } else if(fractions == 4) { return [NSString stringWithFormat:@"%d 1/4",(int)input]; } else if(fractions == 6) { return [NSString stringWithFormat:@"%d 3/8",(int)input]; } else if(fractions == 8) { return [NSString stringWithFormat:@"%d 1/2",(int)input]; } else if(fractions == 10) { return [NSString stringWithFormat:@"%d 5/8",(int)input]; } else if(fractions == 12) { return [NSString stringWithFormat:@"%d 3/4",(int)input]; } else if(fractions == 14) { return [NSString stringWithFormat:@"%d 7/8",(int)input]; } else { return [NSString stringWithFormat:@"%d %d/16",(int)input,fractions]; } } 

编辑 (由杰森编辑的回应)

我优化了你的代码,这样它就更干净了。
另外检查下面的代码,我认为使用数组效率更高。

 - (NSString *)theFunction:(float)input { NSArray * array = [[NSArray alloc] initWithObjects: @"",@"",@"1/8",@"",@"1/4",@"",@"3/8",@"",@"1/2",@"",@"5/8",@"",@"3/4",@"",@"3/4",@"",@"7/8",@"",nil]; int fractions = lroundf((input - (int)input)/((float)1/(float)16)); if(fractions == 0 || fractions == 16) { return [NSString stringWithFormat:@"%d",lroundf(input)]; } else { if([[array objectAtIndex:fractions] isEqualToString:@""]) { return [NSString stringWithFormat:@"%d %d/16",(int)input,fractions]; } else { return [NSString stringWithFormat:@"%d %@",(int)input,[array objectAtIndex:fractions]]; } } } 

我认为你的问题比连接的一个@Caleb简单得多。

除以0.0625得到十六分之一。 将结果四舍五入为最接近的整数i 。 使用整数除法i / 16来获得整个单元的数量,并使用模运算符j = i % 16来得到小数单位。 为了减less分数,可以使用j作为提前创build的数组的索引{ "", "1/16", "1/8", "3/16", ... }

你也可以用16除以16来得到模16的运算符,但是这会使得代码更难读,没有多大的好处。