0

次のメソッドを作成するにはどうすればよいですか?

  • modf(n、1)またはmodf(n、2)を使用しようとしましたが、どちらも「modfの引数2を渡すと、キャストなしで整数からポインターが作成されます。

方法は次のとおりです。

(BOOL) numberHasDecimal: (long double) n {
    if (?????) // has decimal, like 16.300000 or 6453.353259
        return YES;
    else
        return NO; // has no decimal, like 58.000000 or 9274.000000
}
4

4 に答える 4

0
if (fabsl(fmodl(n, 1.0)) > 0.0) {
    // Has a decimal.
} else {
    // Is an integer.
}

浮動小数点値は直感に反する方法で内部的に丸められるため、数値は非常に小さい小数成分を持ち、を通過したときに整数に見える場合があることに注意してfmodl()ください。

また、AppleのObjective-Cの実装は、値を処理するときに壊れてlong doubleおり、それらを使用すると追跡が難しいエラーが発生する可能性があることに注意してください。

于 2010-12-30T18:16:43.360 に答える
0

別の選択肢、どちらを選ぶべきかわからないが、おそらくこれではない。

-(BOOL) numberHasDecimal: (long double) n {
    NSMutableString *decimalTempString;
    decimalTempString = [NSMutableString stringWithFormat: @"%Lf", n];

    // while last character of string = 0 delete last character  (1232.10000)
    while ([decimalTempString characterAtIndex:([decimalTempString length] -1)] == '0') {
        NSRange range = {([decimalTempString length] -1), 1};
        [decimalTempString deleteCharactersInRange:range];
    }
    // if last character is . then delete that too  (1232.)
    if ([decimalTempString characterAtIndex:([decimalTempString length] -1)] == '.') {
        return NO; // has no decimal, like 58. or 9274.
    } else {
        return YES; // has decimal, like 16.3 or 6453.353259
    }
于 2010-12-30T20:17:58.140 に答える
0
- (BOOL) numberHasDecimal:(long double)l {
  return (floorl(l) != l);
}
于 2010-12-30T20:34:08.797 に答える
0

他のポスターが示しているように、より良い質問は「小数部がない」とはどういう意味かを定義することかもしれません。(また、私は長いダブルスについて彼らの注意を繰り返します。)どちらの定義が正しいかは、あなたが達成しようとしていることによって異なります。「1e-6以内」が良い定義であることが多いと思いますが、状況によって異なります。

あなたの特定の質問については、おそらくこれが必要です:

-(BOOL) numberHasDecimal: (double) n 
{
    double integerPart = 0.;
    if (fabs(modf(n, &integerPart)) > 0.) // has decimal, like 16.300000 or 6453.353259
        return YES;
    else
        return NO; // has no decimal, like 58.000000 or 9274.000000
}

何が起こっているのかというと、modf関数は小数部分を返し、数値の整数部分を別のdoubleに格納し、そのアドレスを渡す必要があるということです。その名前にもかかわらず、それは「x%y」と同等ではありません。これは、実際には「return x%1.0、提供されたポインターに(x --floor(x))を格納する」と同等です(少なくとも正の数の場合、つまり)。

2番目のポインタパラメータは、単一の関数呼び出しから複数の値を返す方法と考えることができます。この場合、整数部分については気にしませんが、整数部分を書き込むmodfのアドレスを渡すと、コンパイラが静かになり、探している結果が得られます。

于 2010-12-30T22:04:15.650 に答える