この方法を作りました
+ (CGFloat) round: (CGFloat)f {
int a = f;
CGFloat b = a;
return b;
}
期待どおりに機能しますが、切り捨てのみです。また、負の数の場合は切り捨てます。
これは私が作成した簡単な方法であり、正しく丸めることはそれほど重要ではありません。ゲームのカメラの x 値と y 値を丸めるために作成しただけです。
この方法は大丈夫ですか?速いですか?または、より良い解決策はありますか?
この方法を作りました
+ (CGFloat) round: (CGFloat)f {
int a = f;
CGFloat b = a;
return b;
}
期待どおりに機能しますが、切り捨てのみです。また、負の数の場合は切り捨てます。
これは私が作成した簡単な方法であり、正しく丸めることはそれほど重要ではありません。ゲームのカメラの x 値と y 値を丸めるために作成しただけです。
この方法は大丈夫ですか?速いですか?または、より良い解決策はありますか?
ここでの他の回答は、時代遅れであるか、良い例を示していません。CGFloatSwift の組み込みrounded関数を使用して a を丸めるのは簡単です。
let x: CGFloat = 3.5
let y = x.rounded() // 4.0
値をその場で丸めたい場合は、次を使用できますround。
var x: CGFloat = 3.5
x.round() // 4.0
数値の丸め方をより正確に制御したい場合は、 を使用できますFloatingPointRoundingRule。
x.rounded(.awayFromZero)
ゼロより大きい数値は切り上げられ、ゼロ未満の数値は切り捨てられます。
3.000 -> 3.0
3.001 -> 4.0
3.499 -> 4.0
3.500 -> 4.0
3.999 -> 4.0
-3.000 -> -3.0
-3.001 -> -4.0
-3.499 -> -4.0
-3.500 -> -4.0
-3.999 -> -4.0
x.rounded(.down)
小数値を含む数値を次に小さい整数に丸めます。これは と同じfloor(x)です。
3.000 -> 3.0
3.001 -> 3.0
3.499 -> 3.0
3.500 -> 3.0
3.999 -> 3.0
-3.000 -> -3.0
-3.001 -> -4.0
-3.499 -> -4.0
-3.500 -> -4.0
-3.999 -> -4.0
x.rounded(.toNearestOrAwayFromZero) // same as x.rounded()
10 進数は、最も近い整数値に丸められます。ただし、値がちょうど真ん中にある場合 (3.5またはのよう-3.5に)、正の数は切り上げられ、負の数は切り捨てられます。
長くて複雑な名前を持っているかもしれませんが、これは通常、学校で丸めを学ぶ方法です。するだけのルールでもありますx.rounded()。
3.000 -> 3.0
3.001 -> 3.0
3.499 -> 3.0
3.500 -> 4.0 ***
3.999 -> 4.0
-3.000 -> -3.0
-3.001 -> -3.0
-3.499 -> -3.0
-3.500 -> -4.0 ***
-3.999 -> -4.0
x.rounded(.toNearestOrEven)
これは に似ていますがtoNearestOrAwayFromZero、.5値が偶数の整数に丸められる点が異なります。
3.000 -> 3.0
3.001 -> 3.0
3.499 -> 3.0
3.500 -> 4.0 ***
3.999 -> 4.0
4.500 -> 4.0 ***
-3.000 -> -3.0
-3.001 -> -3.0
-3.499 -> -3.0
-3.500 -> -4.0 ***
-3.999 -> -4.0
-4.500 -> -4.0 ***
x.rounded(.towardZero)
これは、小数値を切り捨てる効果があります。が必要な場合Intは、 で同じことを行うことができますInt(x)。
3.000 -> 3.0
3.001 -> 3.0
3.499 -> 3.0
3.500 -> 3.0
3.999 -> 3.0
-3.000 -> -3.0
-3.001 -> -3.0
-3.499 -> -3.0
-3.500 -> -3.0
-3.999 -> -3.0
x.rounded(.up)
これは の反対です.down。10 進数はすべて切り上げられます。これは と同じceil(x)です。
3.000 -> 3.0
3.001 -> 4.0
3.499 -> 4.0
3.500 -> 4.0
3.999 -> 4.0
-3.000 -> -3.0
-3.001 -> -3.0
-3.499 -> -3.0
-3.500 -> -3.0
-3.999 -> -3.0
roundとの結果roundedはまだCGFloatです。が必要な場合Intは、 のように変換する必要がありますInt(myCGFloat)。round(x)ありceil(x)ませfloor(x)ん。ただし、それらを使用する場合、64ビットと32ビットの両方のアーキテクチャを処理するため、 で見た可能性のある回答はすべてroundf廃止ceilfさfloorfれています。、、
、および(lasf 'f' は「float」バージョンを意味し、それがないバージョンは「double」バージョンを意味します<math.h>) 。floorfceilfroundfrintfnearbyintf
標準的な方法を使用することをお勧めします。これは、それらが標準的であるという理由だけでなく、エッジ ケースでより適切に機能するためです。
2013 アップデート (ジェセド)
iOS はもはや 32 ビットだけではありません。この質問には、より関連性の高い他の多くの回答があります。
ほとんどの回答はインポートについて言及していますtgmath.h
Aは aまたは a のCGFloatいずれかに typedef されているため、他の実数型と同様に丸めることができます。doublefloat
CGFloat round(CGFloat aFloat)
{
return (int)(aFloat + 0.5);
}
これは分数を運ぶのに十分小さい浮動小数点数で機能しますが、大きな値では奇妙な動作をする可能性があることに注意してください。
試してみてください#import "tgmath.h"。
<tgmath.h>ヘッダーにはヘッダーが含まれ、<math.h>いくつか<complex.h>のタイプ ジェネリック マクロが定義されます。
これは C の問題であり、Objective C の問題ではありません。標準の C の round() 関数を使用してください。
32 および 64 ビットで作業する場合は、独自のマクロのようなものを作成できます。
#ifndef CGFLOAT_CEIL
#ifdef CGFLOAT_IS_DOUBLE
#define CGFLOAT_CEIL(value) ceil(value)
#else
#define CGFLOAT_CEIL(value) ceilf(value)
#endif
#endif
Psこれは質問に対する回答ではなく、32/64ビット値の操作方法に関する質問への追加です。
これを MyMacros.h などのファイルで定義し、myapp-Prefix.pch にインポートを追加します。
また、関数のプレフィックスとして CGFloat を選択するとリスクが生じる可能性があることも覚えておいてください。これは、アップルがこのようなマクロを自分で追加する可能性があるためです。そのため、#ifndef CGFLOAT_CEIL は