cgfloatを丸くする方法
-
28-09-2019 - |
質問
この方法を作成しました
+ (CGFloat) round: (CGFloat)f {
int a = f;
CGFloat b = a;
return b;
}
期待どおりに機能しますが、丸みを帯びています。そして、それが負の数である場合、それはまだ締めくくります。
これは私が作った迅速な方法であり、正しく丸くなることはあまり重要ではありません。ゲームのカメラのXとYの値を回るようにしました。
この方法は大丈夫ですか?速いですか?それとも、より良い解決策はありますか?
解決
あなたが必要とするかもしれない動作を備えた標準関数がすでにあります <math.h>
そのような: floorf
, ceilf
,
roundf
, rintf
と nearbyintf
(lasf 'f'は「フロート」バージョンを意味し、それなしのバージョンは「二重」バージョンです)。
標準的な方法が標準であるためだけでなく、エッジの場合はより良く機能するため、標準的な方法を使用する方が良いでしょう。
2013アップデート(Jessedc)
iOSはもう32ビットではありません。この質問に対する他の多くの答えがあり、現在はより関連性があります。
ほとんどの回答はインポートに言及しています tgmath.h
他のヒント
2018回答
ここでの他の答えは、日付が付けられているか、良い例を挙げないかのどちらかです。丸くするのは簡単です CGFloat
Swiftの組み込みを使用します rounded
働き。
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)
. - C Math関数を使用する必要はありません
round(x)
,ceil(x)
とfloor(x)
もう。ただし、それらを使用している場合、64と32のビットアーキテクチャの両方を処理するため、roundf
,ceilf
とfloorf
今は時代遅れです。
a CGFloat
どちらかにタイプされます double
またはa float
, 、したがって、他の実際のタイプのようにそれらを丸めることができます:
CGFloat round(CGFloat aFloat)
{
return (int)(aFloat + 0.5);
}
これは、分数を運ぶのに十分なほど小さいフロートで動作しますが、大きな値に奇妙に作用する可能性があることに注意してください。
試す #import "tgmath.h"
.
<tgmath.h>
ヘッダーにはヘッダーが含まれます <math.h>
と <complex.h>
いくつかのタイプジェネリックマクロを定義します。
ホイールを再発明しています - これはCの質問であり、客観的なCではありません。標準Cラウンド()関数を使用してください。
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を機能のプレフィックスとして選択することはリスクになる可能性があることを忘れないでください。