如何安全地将CGFloat放置或嵌入到int?

Pro*_*ber 18 math floating-point floating-accuracy ios floating-point-precision

我经常需要地板或CEIL一CGFloatint,对于数组索引的计算.

我看到永久的问题floorf(theCGFloat)或者ceilf(theCGFloat)是有可与浮点不准确的麻烦.

那么,如果我CGFloat2.0f内部被表示为1.999999999999f或类似的东西,那该怎么办呢?我floorf并获得1.0f,这是再次浮动.然而,我必须把这个野兽施放到int,这可能会引入另一个问题.

是否有一个最佳实践如何楼或小区一floatint这样的东西像2.0永远不会意外遭到地板到1让人觉得2.0永远不会意外遭到ceiled来2

Sur*_*gch 27

斯威夫特的补充答案

我加入这为那些谁到这里来寻找如何使用补充答案floor,并ceilCGFloat(像我一样).

var myCGFloat: CGFloat = 3.001
floor(myCGFloat) // 3.0
ceil(myCGFloat) // 4.0
Run Code Online (Sandbox Code Playgroud)

如果Int需要,那么可以将其转换为一个.

var myCGFloat: CGFloat = 3.001
Int(floor(myCGFloat)) // 3
Int(ceil(myCGFloat)) // 4
Run Code Online (Sandbox Code Playgroud)

更新

不再需要使用C floorceil函数.您可以将Swift round()舍入规则一起使用.

var myCGFloat: CGFloat = 3.001
myCGFloat.round(.down) // 3.0
myCGFloat.round(.up) // 4.0
Run Code Online (Sandbox Code Playgroud)

如果您不想修改原始变量,请使用rounded().

笔记

  • 适用于32位和64位架构.

也可以看看


Ste*_*non 20

你的问题有几个误解.

如果我的CGFloat是2.0f但在内部它表示为1.999999999999f

不可能发生; 与所有合理的小整数一样,2.0具有浮点的精确表示.如果你CGFloat2.0f,那它真的是2.0.

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

2.0的上限 2; 还有什么可能呢?


我认为你真正要问的问题是"假设我做了一个产生不精确结果的计算,在数学上应该正好是2.0,但实际上略少;当我应用于floor该值时,我得到1.0而不是2.0- - 我怎么防止这个?"

这实际上是一个相当微妙的问题,没有一个"正确"的答案.你是如何计算输入值的?你打算怎么处理这个结果?