web-dev-qa-db-ja.com

iOS Objective-C 10進数の丸められた2つの浮動小数点値を取得する方法

私が持っています

float a = 1412.244019;

そして、1412.24000000のような最も近い2番目の小数に丸める必要があります。小数点以下2桁のみを表示したい場合、%。2fを使用することを理解していますが、そうではありません。フロートとして数学的な理由で新しいaが必要です。

私は幸運なしにstackoverflowで見つかったいくつかの方法を試しました。私が使用したより明白なものは、以下で言及しますが、それを使用する運はまだありませんでした。魔法が起こっていない理由を見ることができますか?

PS:常にではないが、時には望みの効果を発揮します。

前もって感謝します。

コード:

float a = 1412.244019;
NSLog(@"a is %f", a); //output a is 1412.244019
a = [[NSString stringWithFormat:@"%.2f", a] floatValue];
NSLog(@"a is %f", a); //output a is 1412.239990

編集:

上記の手術後にフロートを使用しているときのようなSEEMSは、NSLogの表示が異なりますが、奇妙なことに1412.240000であると考えています。しかし、私は私が欲しいものを手に入れているので、無駄な時間のために賞賛は何も追いかけません:)

[〜#〜] edit [〜#〜]正解としてすべてを選択したいのですが、選択できるのは1つだけなので、追加説明のある最初の良い回答を選択しました最終)。

29
B-Man

これを試しましたか?

CGFloat val = 37.777779;

CGFloat rounded_down = floorf(val * 100) / 100;   /* Result: 37.77 */
CGFloat nearest = floorf(val * 100 + 0.5) / 100;  /* Result: 37.78 */
CGFloat rounded_up = ceilf(val * 100) / 100;      /* Result: 37.78 */

source: Cの小数点以下2桁までの端数

補完:コンピューターが浮動小数点値をどのように保存するかを制御することはできません。

したがって、これらの丸められた値は、「明白な」10進数値とは正確に一致しない場合がありますが、非常に近い値であり、これが最大の保証となります。

58
Lucas Eduardo

Objective-CでもCと同じように行います。

double notRounded = ...;
double rounded = round (notRounded * 100.0) / 100.0;

Floatを使用しないでください-doubleに対してfloatを使用する具体的な理由を誰かに正確に説明できる場合を除きます。 floatの精度は非常に限られています。また、「ラウンド」という名前の完全に標準的な機能があるため、ceilまたはfloorを使用するのは簡単です。

Floatとdoubleはどちらもexactlyは12.24のようにほとんどの10進数値を表すことはできません。 doubleの精度がはるかに高いため、doubleを使用すると12.24にさらに近づくことができます。したがって、NSLogが12.23999997394などのように(浮動)12.24に対して奇妙な数値を表示する可能性が非常に高く、一方、二重に12.24を表示する可能性があります。

11
gnasher729

この行のエラー

a = [[NSString stringWithFormat:@"%.2f", a] floatValue];

修正する

a = [NSString stringWithFormat:@"%.02f", a];
6
Mitesh Varu

floatが持つことができる1412.24に最も近い値は1412.239990234375です。 floatオブジェクトの形式は近い値を表さないため、それよりも近いfloatを生成できるno操作があります。 floatで1412.24を表すように依頼することは、intで2.5を表すように依頼するようなものです。それは単純に不可能です。

これに対処するためのオプションは次のとおりです。

  • 基になるfloatオブジェクトを変更せずに、「1412.24」を表示するフォーマットを使用できます。
  • doubleを使用して、より近くに(はるかに)近づけることができますが、それでも1412.24にはなりません。
  • float値を表現可能な値にスケーリングできます(たとえば、他の単位で測定して、floatですべての値が正確に表現できるようにします)。
  • NSDecimalなど、別のデータ型を使用できます。
5

フロート値を強制することはできません。浮動小数点数は大きさが大きいため、いくぶん近似するように設計されています。使用するビット数が非常に多いため、10進数に近づけることはできますが、正確には表現できません。

1つの提案は、すべての算術を100倍した整数で行い、最終結果を表示するときに除算することです。数値が大きすぎると、これが禁止される場合があります。

2
Owen Hartnett

Aに100.0を乗算し、おそらく丸めに0.5を追加してから、結果のint値を取得できます。次に、/ 100を使用して小数点の前の値を取得し、%100を使用して小数点以下2桁を取得できます。

2
David Elliman