21

この方法を作りました

+ (CGFloat) round: (CGFloat)f {
    int a = f;
    CGFloat b = a;
    return b;
}

期待どおりに機能しますが、切り捨てのみです。また、負の数の場合は切り捨てます。

これは私が作成した簡単な方法であり、正しく丸めることはそれほど重要ではありません。ゲームのカメラの x 値と y 値を丸めるために作成しただけです。

この方法は大丈夫ですか?速いですか?または、より良い解決策はありますか?

4

6 に答える 6

66

2018年回答

ここでの他の回答は、時代遅れであるか、良い例を示していません。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)
  • C の数学関数を使用する必要はround(x)ありceil(x)ませfloor(x)ん。ただし、それらを使用する場合、64ビットと32ビットの両方のアーキテクチャを処理するため、 で見た可能性のある回答はすべてroundf廃止ceilffloorfれています。
于 2016-01-14T08:47:28.607 に答える
28

、、 、および(lasf 'f' は「float」バージョンを意味し、それがないバージョンは「double」バージョンを意味します<math.h>) 。floorfceilfroundfrintfnearbyintf

標準的な方法を使用することをお勧めします。これは、それらが標準的であるという理由だけでなく、エッジ ケースでより適切に機能するためです。

2013 アップデート (ジェセド)

iOS はもはや 32 ビットだけではありません。この質問には、より関連性の高い他の多くの回答があります。

ほとんどの回答はインポートについて言及していますtgmath.h

于 2010-04-19T12:10:20.603 に答える
5

Aは aまたは a のCGFloatいずれかに typedef されているため、他の実数型と同様に丸めることができます。doublefloat

CGFloat round(CGFloat aFloat)
{
    return (int)(aFloat + 0.5);
}

これは分数を運ぶのに十分小さい浮動小数点数で機能しますが、大きな値では奇妙な動作をする可能性があることに注意してください。

于 2010-04-19T12:02:33.463 に答える
1

試してみてください#import "tgmath.h"

<tgmath.h>ヘッダーにはヘッダーが含まれ、<math.h>いくつか<complex.h>のタイプ ジェネリック マクロが定義されます。

于 2013-06-07T14:12:19.090 に答える
1

これは C の問題であり、Objective C の問題ではありません。標準の C の round() 関数を使用してください。

于 2010-04-19T12:10:22.493 に答える
0

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 は

于 2014-09-01T09:18:54.293 に答える