NSTimeInterval == ダブル; (例: 169.12345666663)
「ドット」の後に2桁しか残らないように、この倍精度を切り上げるにはどうすればよいですか?
結果が NSNumber であれば非常に良いでしょう。
NSTimeInterval == ダブル; (例: 169.12345666663)
「ドット」の後に2桁しか残らないように、この倍精度を切り上げるにはどうすればよいですか?
結果が NSNumber であれば非常に良いでしょう。
これが表示目的の場合は、NSNumberFormatterを見てください。
何らかの理由で計算で double を丸めたい場合は、標準の Cround()
関数を使用できます。
どうしてもドットの後に 2 桁残したい場合は、100 を掛け、round() 関数を使用して丸め、再度 100 で割ります。ただし、これは、ドットの後に実際に 2 桁しかないことを保証するものではありません。再度分割すると、実際には浮動小数点表記では表現できない数値が得られ、0.1 を期待すると、実際には 0.09999 になる可能性があるためです。 .、これは、浮動小数点表記を使用して 0.1 を実際に表現できないためです。
表示目的でドットの後の 2 桁に丸めたい場合は、提案されているように NSNumberFormatter を使用するか、次のように使用できます。
printf("%.2f\n", yourTimeInterval);
NSLog(@"%.2f\n", yourTimeInterval);
または NSString を取得するには、次を使用することもできます。これは、おそらく NumberFormatter を使用するよりも高速です (ただし、ユーザー設定に従ってローカライズされません)。
NSString * intervalStr = nil;
char * intervalStrTmp = NULL;
asprintf(&intervalStrTmp, "%.2f", yourTimeInteval);
if (intervalStrTmp) {
intervalStr = [[NSString alloc] initWithUTF8String:intervalStrTmp];
free(intervalStrTmp);
}
NSDecimal は、 NSDecimalRound()を使用して、指定された桁数に丸めることができます。
double d = [[NSDate date] timeIntervalSince1970];
NSDecimal in = [[NSNumber numberWithDouble:d] decimalValue];
NSDecimal out;
NSDecimalRound( &out, &in, 2, NSRoundUp );
NSDecimalNumber *result = [NSDecimalNumber decimalNumberWithDecimal:out];
このHumanReadableTimeIntervalは役に立ちますか? ただし、NSString を返します。または、100 を掛けて整数に変換し、再度 100 で割ることで丸めることもできます。
ほとんどの場合、数値の丸めは、表示時にのみ行う必要があります。浮動小数点数 (double または not) のプロパティにより、特定の数値を固定精度で格納することができなくなります。
数値をフォーマットして小数点以下 2 桁まで表示する方法については、この他の投稿 を参照してください。
ANSICround()
関数を使用します。
次を使用して、いつでも数値を丸めることができます。
double round2dec(double a) { return round(a * 100) / 100; }
しかし、結果を double として表現すると、小数点以下 2 桁しかない可能性があります。
ここで、== 記号を使用することで、2 つの double 数値の比較が 2 番目の小数点に対してのみ行われることを意味します。できることは次のとおりです。
fabs(round2dec(NSTimeInterval) - round2dec(double)) < std::numeric_limits<double>::epsilon()