目的C:長い二重使用法の作成10進数
-
14-10-2019 - |
質問
次の方法を作成するにはどうすればよいですか?
- 私はmodf(n、1)またはmodf(n、2)を使用しようとしましたが、どちらも「modfの引数2を渡す2つの引数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
}
解決
if (fabsl(fmodl(n, 1.0)) > 0.0) {
// Has a decimal.
} else {
// Is an integer.
}
フローティングポイント値は直感に反する方法で内部的に丸みを帯びているため、数値は非常に少ない部分成分を持ち、通過すると積分が積分に見えることに留意してください。 fmodl()
.
また、AppleのObjective-Cの実装は処理時に壊れていることに注意してください long double
値、およびそれらを使用すると、追跡が困難なエラーを明らかにする場合があります。
他のヒント
別の選択肢は、どちらから選ぶべきかわからないが、おそらくこれではない。
-(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
}
他のポスターが示しているように、より良い質問は、「小数パートを持たない」という意味を定義することです。 (また、私は彼らの注意を長いダブルスに反映しています。)どの定義が正しいかは、あなたが達成しようとしていることによって異なります。 「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関数が分数部分を返し、整数部分を別のダブルに保存したいということです。その名前にもかかわらず、それは「x%y」に相当するものではありません。それは本当に「x%1.0を返す、(x -floor(x))を提供されたポインターに保存する」(少なくとも正の数の場合、つまり)に相当するものです。
2番目のポインターパラメーターを、単一の関数呼び出しから複数の値を返す方法と考えることができます。この場合、整数部分については気にしませんが、MODFのアドレスを渡して整数部分を書き込み、コンパイラを静かにし、探している結果を得ることができます。
- (BOOL) numberHasDecimal:(long double)l {
return (floorl(l) != l);
}