Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何安全地将CGFloat落地或落地到int?_Ios_Math_Floating Point_Floating Accuracy_Floating Point Precision - Fatal编程技术网

Ios 如何安全地将CGFloat落地或落地到int?

Ios 如何安全地将CGFloat落地或落地到int?,ios,math,floating-point,floating-accuracy,floating-point-precision,Ios,Math,Floating Point,Floating Accuracy,Floating Point Precision,我经常需要将CGFloat设置为int,以计算数组索引 我一直看到的floorf(theCGFloat)或ceilf(theCGFloat)的问题是,浮点精度可能会出现问题 那么,如果我的CGFloat是2.0f,但在内部它表示为1.9999999999f或类似的东西,该怎么办呢。我做了floorf,得到了1.0f,这又是一个浮点数。然而,我必须将这个野兽转换为int,这可能会带来另一个问题 有没有一种最佳做法,可以将浮点设置为整数,这样2.0之类的东西就不会意外地设置为1,而2.0之类的东西就

我经常需要将
CGFloat
设置为
int
,以计算数组索引

我一直看到的
floorf(theCGFloat)
ceilf(theCGFloat)
的问题是,浮点精度可能会出现问题

那么,如果我的
CGFloat
2.0f
,但在内部它表示为
1.9999999999f
或类似的东西,该怎么办呢。我做了
floorf
,得到了
1.0f
,这又是一个浮点数。然而,我必须将这个野兽转换为int,这可能会带来另一个问题


有没有一种最佳做法,可以将
浮点
设置为
整数
,这样
2.0
之类的东西就不会意外地设置为
1
,而
2.0
之类的东西就不会意外地设置为
2

编辑-阅读注释,了解为什么这个答案不正确右:)

float
转换为
int
是一种隐式
floorf
,即
(int)5.9
5
。如果你不介意的话,就投:)

如果您想取整,则只需对
ceilf的结果进行强制转换
-取整后的强制转换不应引入任何错误(或者,如果您愿意,在强制转换前添加一个错误,即,`(int)(5.9+1)`与取整相同)


要四舍五入,只需添加0.5-
(int)(5.9+0.5)
6
,但
(int)(5.4+0.5)
5
。虽然我只想使用
roundf(5.9)
:)

但是在你的问题中有一些误解

如果我的CGFloat为2.0f,但在内部表示为1.99999999F,该怎么办

不可能发生;2.0与所有合理的小整数一样,具有浮点的精确表示形式。如果您的
CGFloat
2.0f
,那么它实际上是2.0

像2.0这样的东西永远不会意外地被设为2

2.0的上限为2;还可能是什么


我想你真正要问的问题是“假设我做的计算产生了一个不精确的结果,从数学上来说应该正好是2.0,但实际上稍微小一些;当我对该值应用
floor
时,我得到的是1.0而不是2.0——我如何防止这种情况发生?”


这实际上是一个相当微妙的问题,没有一个“正确”的答案。您是如何计算输入值的?你打算对结果做什么?

快速补充答案

我添加此项作为补充回答,以帮助那些来到这里了解如何将
floor
ceil
CGFloat
一起使用的人(就像我所做的那样)

如果需要
Int
,则可以将其转换为1

var myCGFloat: CGFloat = 3.001
Int(floor(myCGFloat)) // 3
Int(ceil(myCGFloat)) // 4
更新

不再需要使用C
floor
ceil
功能。您可以将Swift
round()
与一起使用

如果不希望修改原始变量,请使用
rounded()

注释

  • 适用于32位和64位体系结构
另请参见


将浮点数转换为int不是一个隐含的下限。在C和其他一些通用语言中,它是一种截断(接近零)。地板在负无穷大方向舍入到最接近的整数。将-3.5转换为整数会产生-3,但下限(-3.5)是-4。好吧,这是一个公平的点-我已经被过分简化到了错误的程度:)在提供说明输入值中的错误以及返回值过高或过低的后果的规范之前,这个问题无法正确回答。在返回过高的值(因为先前的舍入误差使该值过高)和返回过低的值(因为该值被人为调整以补偿先前的误差)之间存在权衡,反之亦然。没有上下文的解释,就没有单一的正确答案。
var myCGFloat: CGFloat = 3.001
Int(floor(myCGFloat)) // 3
Int(ceil(myCGFloat)) // 4
var myCGFloat: CGFloat = 3.001
myCGFloat.round(.down) // 3.0
myCGFloat.round(.up) // 4.0