Objective c 在给定特定分母的情况下,求浮点分数的分子

Objective c 在给定特定分母的情况下,求浮点分数的分子,objective-c,cocoa-touch,ios,text,fractions,Objective C,Cocoa Touch,Ios,Text,Fractions,可能的重复项: 我想取一个变量中的小数点5.50,只将小数部分除以0.0625,这是我的精度点。这将给我8,如8/16或1/2 然后我想在文本字段中显示答案为5 8/16或1/2。我知道有些答案在除以0.0625时仍然返回一个小数,而不是一个整数,但我会将该答案四舍五入,这仍然会使我得到最接近的16位。最好的方法是什么?我想做一个函数,这样我可以重用它。是的,我发布了一个类似的问题,得到了回答,但没能让它起作用。我想有一个更好更简单的方法,所以我发布了这个。提前谢谢。我认为您的问题比@Cale

可能的重复项:

我想取一个变量中的小数点5.50,只将小数部分除以0.0625,这是我的精度点。这将给我8,如8/16或1/2


然后我想在文本字段中显示答案为5 8/16或1/2。我知道有些答案在除以0.0625时仍然返回一个小数,而不是一个整数,但我会将该答案四舍五入,这仍然会使我得到最接近的16位。最好的方法是什么?我想做一个函数,这样我可以重用它。是的,我发布了一个类似的问题,得到了回答,但没能让它起作用。我想有一个更好更简单的方法,所以我发布了这个。提前谢谢。

我认为您的问题比@Caleb链接到的问题简单得多

除以0.0625得到十六分之一的数字。将结果四舍五入到最接近的整数i。使用整数除法i/16获得整数单位数,并使用模运算符j=i%16获得分数单位。要减少分数,请使用j作为索引,索引到预先创建的数组{,1/16,1/8,3/16,…}


您也可以除以16,然后使用位运算符得到模16,但这会使代码更难阅读,但没有多少好处。

我认为您的问题比@Caleb链接到的问题简单得多

除以0.0625得到十六分之一的数字。将结果四舍五入到最接近的整数i。使用整数除法i/16获得整数单位数,并使用模运算符j=i%16获得分数单位。要减少分数,请使用j作为索引,索引到预先创建的数组{,1/16,1/8,3/16,…}

您也可以除以16,然后使用位运算符得到模16,但这将使代码更难阅读,但没有多少好处。

函数:

注:

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编辑的响应

我优化了你的代码,这样更干净。 还要检查下面的代码,我认为使用数组更有效

- (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]];
        }
    }

}
功能:

注:

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编辑的响应

我优化了你的代码,这样更干净。 还要检查下面的代码,我认为使用数组更有效

- (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]];
        }
    }

}

不,我也看到了。这要简单得多,或者我认为应该如此。只需将小数点后的所有内容转换为NSInteger,除以.0625,然后将所有内容一起显示为分数。是吗?这是我的另一个问题,但没有用。我的标题是如何改变的?有了足够的声誉,用户就可以编辑问题和答案了。你可以通过查看问题底部的第二个框,即“编辑的x分钟前”来查看编辑的人和内容@Jason:我编辑你的问题是为了澄清问题,然后再决定是否与你先前的问题重复。我试着让这张图更具体一些,但我仍然相信你先前问题的答案也回答了这个问题,所以我投票以重复的方式结束。如果您不同意,请编辑您的问题,并解释您接受的其他答案不适用于本案例的具体原因。不,我也看到了。这要简单得多,或者我认为应该如此。只需将小数点后的所有内容转换为NSInteger,除以.0625,然后将所有内容一起显示为分数。是吗?这是我的另一个问题,但没有用。我的标题是如何改变的?有了足够的声誉,用户就可以编辑问题和答案了。你可以通过查看问题底部的第二个框,即“编辑的x分钟前”来查看编辑的人和内容@Jason:我编辑你的问题是为了澄清问题,然后再决定是否与你先前的问题重复。我试着让这张图更具体一些,但我仍然相信你先前问题的答案也回答了这个问题,所以我投票以重复的方式结束。如果您不同意,请编辑您的问题,并解释您接受的其他答案不适用于本案例的具体原因。我想您理解我正在努力做的最好的事情。听起来你一针见血……你是否愿意在这里写一个函数作为模板?他刚刚给了你需要采取的步骤,非常清楚-你有什么困难?我想你明白我正在努力做的最好的事情。听起来你一针见血……你是否愿意在这里写一个函数作为模板?他刚刚给了你步骤
您需要非常清楚地了解-您遇到的困难是什么?输入变量会去哪里?您不需要为代码设置变量?+1的文本吗。“我面前没有Objective-C编译器,反正也太懒了。”Jason。您只需将函数粘贴到实现文件.m文件中,然后像NSString*result=[self-theFunction:5.03];那样调用它即可;。添加了如何在没有函数的情况下运行代码的代码段。因此,如果我有你的函数,调用它并显示它是否正确?NSString*result=[self-theFunction:myVariable];[myTextField setText:[NSString stringWithFormat:@%d%d/16,结果]];输入是变量要去的地方吗?您不需要为代码设置变量?+1的文本吗。“我面前没有Objective-C编译器,反正也太懒了。”Jason。您只需将函数粘贴到实现文件.m文件中,然后像NSString*result=[self-theFunction:5.03];那样调用它即可;。添加了如何在没有函数的情况下运行代码的代码段。因此,如果我有你的函数,调用它并显示它是否正确?NSString*result=[self-theFunction:myVariable];[myTextField setText:[NSString stringWithFormat:@%d%d/16,结果]];