可能重复:
How to convert floats to human-readable fractions?
Convert decimal to fraction in Objective-C?
我想取一个小数,5.50
,它在一个变量中,并且只将小数部分除以0.0625
,这是我的准确点。这会给我8
,就像8/16
或1/2
一样。
然后,我想在文本字段中将该答案显示为5 8/16
或1/2
。我知道一些答案会在除以.0625
时返回一个十进制小数而不是一个整数,但我会回答这个答案,这仍然会给我最接近的16位。最好的方法是什么?我想创建一个函数,以便我可以重用它。是的,我发布了一个类似的问题,但是无法解决问题。我想有更好更简单的方法,所以我发布了这个。提前谢谢。
答案 0 :(得分:4)
<强>功能:强>
- (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
转换为5
,将5 16/16
转换为6
。
如果您更喜欢5 0/16
和5 16/16
表示法,请将if
语句替换为:
return [NSString stringWithFormat:@"%d %d/16",(int)input,fractions];
编辑: (由Jason提供)
//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];
}
}
编辑(Jason编辑回应)
我优化了您的代码,这样更清洁 还要检查下面的代码,我认为使用数组效率更高。
- (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]];
}
}
}
答案 1 :(得分:2)
我认为你的问题要比@Caleb链接的问题简单得多。
除以0.0625得到十六分之一。将结果舍入到最接近的整数i
。使用整数除法i / 16
来获取整个单位的数量,并使用模运算符j = i % 16
来获得小数单位。要减少分数,请使用j
作为您提前创建的数组的索引{ "", "1/16", "1/8", "3/16", ... }
。
你也可以除以16并使用按位运算符得到模16,但这会使代码难以读取而没有太大的好处。