给定一个特定的分母,找到一个float的小数值的分子

时间:2011-05-19 16:37:11

标签: objective-c cocoa-touch ios text fractions

  

可能重复:
  How to convert floats to human-readable fractions?
  Convert decimal to fraction in Objective-C?

我想取一个小数,5.50,它在一个变量中,并且只将小数部分除以0.0625,这是我的准确点。这会给我8,就像8/161/2一样。

然后,我想在文本字段中将该答案显示为5 8/161/2。我知道一些答案会在除以.0625时返回一个十进制小数而不是一个整数,但我会回答这个答案,这仍然会给我最接近的16位。最好的方法是什么?我想创建一个函数,以便我可以重用它。是的,我发布了一个类似的问题,但是无法解决问题。我想有更好更简单的方法,所以我发布了这个。提前谢谢。

2 个答案:

答案 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/165 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,但这会使代码难以读取而没有太大的好处。