NSTimeIntervalを読みNSNumber
-
05-09-2019 - |
質問
NSTimeInterval==ダブル;(例:169.12345666663)
たいのですが休はこのダブルである2桁の"dot"?
この非常に良いる場合、結果はNSNumber.
解決
これはディスプレイ目的のためこれらを実現するために、 NSNumberFormatter.
また、ダブルの計算にお、何らかの理由で利用できます標準C round()
機能です。
他のヒント
A 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];
は、再び100で割り、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);
}
の大多数の場合に丸め数だるだけでなく表示されます。の性質を浮動小数点数(doubleになることができなくなると考える店舗に関する高度なプロパティを設定で固定。
情報についてのフォーマット数で表示する小数点の位置、 このポスト.
この HumanReadableTimeInterval を助けていますか?これは、しかし、NSStringのを返します。 また、あなたは、100を乗じた整数に変換し、再び100を介して分割することによって自分自身を締めくくることができます。
私は、ANSI Cのround()
機能を使用することになります。
あなたは常に数ラウンド使用することができます:
double round2dec(double a) { return round(a * 100) / 100; }
しかし、チャンスは、二重のように、結果の表現は唯一の2小数点以下を持っていないということです。
さて、==記号を使用している場合、あなたは2重の数値の比較のみ小数点以下第三位になることを意味しました。ここで何ができるかです。
fabs(round2dec(NSTimeInterval) - round2dec(double)) < std::numeric_limits<double>::epsilon()