如何对 CGFloat 进行四舍五入
我做了这个方法,
+ (CGFloat) round: (CGFloat)f {
int a = f;
CGFloat b = a;
return b;
}
它按预期工作,但它只是向下舍入。如果它是负数,它仍然向下舍入。
这只是我制作的一个快速方法,正确舍入并不是很重要,我只是为我的游戏舍入了相机的 x 和 y 值。
这个方法可以吗?快吗?或者有更好的解决方案吗?
I made this method
+ (CGFloat) round: (CGFloat)f {
int a = f;
CGFloat b = a;
return b;
}
It works as expected but it only rounds down. And if it's a negative number it still rounds down.
This was just a quick method I made, it isn't very important that it rounds correctly, I just made it to round the camera's x and y values for my game.
Is this method okay? Is it fast? Or is there a better solution?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
2018 答案
这里的其他答案要么已经过时,要么没有给出很好的例子。使用 Swift 内置的
rounded
函数可以轻松对CGFloat
进行舍入。如果您想就地舍入值,可以使用
round
:舍入规则
如果您想更精确地控制数字的舍入方式,可以使用
FloatingPointRoundingRule
。远离零
零以上的数字向上舍入,零以下的数字四舍五入向下。
向下
将任何具有小数值的数字向下舍入到下一个较小的整数。这与
floor(x)
相同。最接近或远离零
小数四舍五入到最接近的整数值。但是,当值恰好位于中间时(例如
3.5
或-3.5
),则正数将向上舍入,负数将向下舍入。它可能有一个又长又复杂的名字,但这通常是人们在学校学习舍入的方式。如果您只执行
x.rounded()
,这也是使用的规则。到最接近或偶数
这类似于
toNearestOrAwayFromZero
,但现在.5
值四舍五入为偶数。趋向零
这只会产生截断任何小数值的效果。如果您需要
Int
,您可以使用Int(x)
执行相同的操作。Up
这与
.down
相反。所有小数均四舍五入。这与ceil(x)
相同。注意
round
和rounded
的结果仍然是CGFloat
。如果您需要Int
,则必须像Int(myCGFloat)
一样对其进行转换。round(x)
、ceil(x)
和floor(x)
。但是,如果您确实使用它们,它们可以处理 64 位和 32 位架构,因此您可能在roundf
、ceilf
和floorf
中看到过任何答案现在已经过时了。2018 Answer
The other answers here are either dated or don't give good examples. It is easy to round a
CGFloat
using Swift's built inrounded
function.If you want to round the value in place you can use
round
:Rounding Rules
If you want more precise control over how numbers are rounded, you can use a
FloatingPointRoundingRule
.Away from zero
Numbers above zero are rounded up and numbers below zero are rounded down.
Down
Rounds any number with a decimal value down to the next smaller whole number. This is the same as
floor(x)
.To nearest or away from zero
Decimal numbers get rounded to the nearest integer value. However, when the value is exactly in the middle (like
3.5
or-3.5
) then positive numbers get rounded up and negative numbers get rounded down.It may have a long complicated name, but this is normally how one learns rounding in school. It is also the rule used if you just do
x.rounded()
.To nearest or even
This is similar to
toNearestOrAwayFromZero
, except now the.5
values get rounded to the even whole number.Toward zero
This just has the effect of cutting off any decimal values. If you needed an
Int
you could do the same thing withInt(x)
.Up
This is the opposite of
.down
. All decimal numbers are rounded up. This is the same asceil(x)
.Notes
round
androunded
are stillCGFloat
. If you need anInt
you have to convert it likeInt(myCGFloat)
.round(x)
,ceil(x)
andfloor(x)
anymore. However, if you do use them, they handle both 64 and 32 bit architecture so any answers you may have seen withroundf
,ceilf
andfloorf
are now obsolete.
中已经存在您可能需要的具有行为的标准函数,例如:floorf
、ceilf
、roundf
、rintf
和nearbyintf
(lasf 'f' 表示“浮动”版本,没有它的版本是“双”版本)。最好使用标准方法,不仅因为它们是标准的,而且因为它们在边缘情况下工作得更好。
2013 更新 (jessedc)
iOS 不再只有 32 位。这个问题还有许多其他答案现在更相关。
大多数答案都提到导入
tgmath.h
There are already standard functions with behaviors you might need in
<math.h>
such as:floorf
,ceilf
,roundf
,rintf
andnearbyintf
(lasf 'f' means "float" version, versions without it are "double" versions).It is better to use standard methods not only because they are standard, but because they work better in edge cases.
2013 Update (jessedc)
iOS is no longer only 32 bit. There are a number of other answers to this question that are now more relevant.
Most answers mention importing
tgmath.h
CGFloat
被类型定义为double
或float
,因此您可以像任何其他实际类型一样对它们进行舍入:请注意,虽然这适用于小到足以携带小数的浮点数,对于大值可能会表现得很奇怪。
A
CGFloat
is typedef'd to either adouble
or afloat
, so you can round them like any other real type:Note that while this works with floats small enough to carry a fraction, it may act weird on large values.
你正在重新发明轮子 - 这是一个 C 问题,而不是 Objective C。只需使用标准的 C round() 函数即可。
You are reinventing the wheel - and this is a C question, not Objective C. Just use the standard C round() function.
尝试
#import "tgmath.h"
。
标头将包含标头
和
并将定义几个类型通用宏。Try
#import "tgmath.h"
.The
<tgmath.h>
header will include the headers<math.h>
and<complex.h>
and will define several type-generic macros.对于使用 32 和 64 位,您可以创建自己的宏,例如
Ps,这不是问题的答案,而是有关如何使用 32/64 位值的问题的补充。
在像 MyMacros.h 这样的文件中定义它,然后在 myapp-Prefix.pch 中添加导入
还要记住,选择 CGFloat 作为函数的前缀可能存在风险,因为苹果可能会自己添加这样的宏,这就是为什么#ifndef CGFLOAT_CEIL 是
For working with 32 and 64 bit you can create your own macro's like
Ps this isn't an answer for the question but an addition for the question about how to work with 32/64 bit values.
Define this in a file like MyMacros.h and than add an import in the myapp-Prefix.pch
Also remember that choosing CGFloat as prefix for your function can be a risk since apple might add a macro like this them self so that is why the #ifndef CGFLOAT_CEIL is