1

重複の可能性:
フロートを人間が読める形式の分数に変換する方法は?
Objective-Cで小数を分数に変換しますか?

5.50変数に含まれる小数を取り、小数部分のみ0.0625を精度ポイントであるで除算したいと思います。これにより、または8のように、が得られます。8/161/2

5 8/16次に、その回答をテキストフィールドとしてまたはテキストフィールドに表示したいと思い1/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];
    }
}

EDIT(ジェイソンによる編集への応答)

私はあなたのコードを最適化しました、このようにそれははるかにきれいです。
以下のコードも確認してください。配列を使用する方が効率的だと思います。

- (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で割ると、16分の1の数が得られます。結果を最も近い整数に丸め iます。整数除算i / 16を使用して単位全体の数を取得し、モジュロ演算子を使用しj = i % 16て分数単位を取得します。分数を減らすには、j事前に作成した配列のインデックスとして使用します{ "", "1/16", "1/8", "3/16", ... }

16で除算し、ビット演算子を使用してモジュロ16を取得することもできますが、それではコードが読みにくくなり、あまりメリットがありません。

于 2011-05-19T17:03:56.180 に答える