1

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

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

然后我想将该答案显示为5 8/161/2在文本字段中。我知道有些答案在除以 时仍会返回小数而不是整数.0625,但我会将该答案四舍五入,这仍然会给我最接近的 16 位。最好的方法是什么?我想做一个函数,以便我可以重用它。是的,我发布了一个类似的问题,该问题已得到解答,但无法使其正常工作。我在想有一个更好更简单的方法可以做到这一点,所以我发布了这个。提前致谢。

4

2 回答 2

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/165和。 如果您更喜欢and表示法,请将语句替换为:5 16/166
5 0/165 16/16if

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

}
于 2011-05-19T17:45:19.560 回答
2

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

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

您也可以使用按位运算符除以 16 并获得模 16,但这会使代码更难阅读而没有多大好处。

于 2011-05-19T17:03:56.180 回答