3

重複の可能性:
float 値を切り上げるための NSNumberFormatter

現在、次を使用してスケーリング係数を計算します。

CGFloat scale = CGContextGetCTM(context).a;
NSLog(@"SCALE : %f", scale);

0.124979、0.249958、0.499917 の浮動小数点値を受け取ります。roundf を使用して、それぞれ 0.125、0.250、0.500 に変換するにはどうすればよいですか。

4

3 に答える 3

9

これを試して........

NSLog(@"SCALE : %.3f", scale);
NSString *value = [NSString stringWithFormat:@"%.3f", theFloat];

前のSOの回答から盗まれました

于 2011-07-11T16:45:54.423 に答える
7

まだ浮動小数点数であるが、表示目的だけでなく、小数点以下 3 桁までの丸められた数値が必要なように聞こえますか? それはあなたが求めているものですか?IEEE 浮動小数点数は本当に苦痛です。foo = 1.5 を割り当てると、1.499999999 になり、if ( foo == 1.5 )失敗すると言うことができます。私にはバグのように思えますが、これがネット上で「正しい」理由についての長い説明があります。私には、象牙の塔のように正しく、現実世界では役に立たないように思えます。

だから、いくつかの可能性。1000 を掛けてから整数値に切り上げてから 1000 で割ってもうまくいくのだろうか... もちろん、同じ IEEE 浮動バグ、申し訳ありませんが仕様がまだあなたを噛むかもしれません... 試してみる価値があります。

好奇心をそそられ、簡単なテストを書きました。

CGFloat foo = 0.124979;
NSLog(@"foo is: %f", foo );
NSInteger ifoo = ceil(foo * 1000.0);
foo = ifoo / 1000.0;
NSLog( @"ifoo is: %d, and back to foo is: %f", ifoo, foo );

これを出力します(とにかくシミュレーターで):

test[5127:207] foo is: 0.124979
test[5127:207] ifoo is: 125, and back to foo is: 0.125000

それはあなたが望むことをするかもしれません。

幸運。

于 2011-07-11T18:09:25.513 に答える
0

このstackoverflowリンクを見てください。丸めて文字列としてキャストするか、NSNumberFormatterを使用して丸めるという2つの適切なオプションがあります。

リンク: CGFLoat の丸め

これがお役に立てば幸いです!

于 2011-07-11T16:46:14.747 に答える