Pro*_*ber 18 math floating-point floating-accuracy ios floating-point-precision
我经常需要地板或CEIL一CGFloat到int,对于数组索引的计算.
我看到永久的问题floorf(theCGFloat)或者ceilf(theCGFloat)是有可与浮点不准确的麻烦.
那么,如果我CGFloat的2.0f内部被表示为1.999999999999f或类似的东西,那该怎么办呢?我floorf并获得1.0f,这是再次浮动.然而,我必须把这个野兽施放到int,这可能会引入另一个问题.
是否有一个最佳实践如何楼或小区一float到int这样的东西像2.0永远不会意外遭到地板到1让人觉得2.0永远不会意外遭到ceiled来2?
Sur*_*gch 27
斯威夫特的补充答案
我加入这为那些谁到这里来寻找如何使用补充答案floor,并ceil用CGFloat(像我一样).
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 floor和ceil函数.您可以将Swift round()与舍入规则一起使用.
var myCGFloat: CGFloat = 3.001
myCGFloat.round(.down) // 3.0
myCGFloat.round(.up) // 4.0
Run Code Online (Sandbox Code Playgroud)
如果您不想修改原始变量,请使用rounded().
笔记
也可以看看
Ste*_*non 20
你的问题有几个误解.
如果我的CGFloat是2.0f但在内部它表示为1.999999999999f
不可能发生; 与所有合理的小整数一样,2.0具有浮点的精确表示.如果你CGFloat是2.0f,那它真的是2.0.
像2.0这样的东西永远不会被意外地弄到2
2.0的上限是 2; 还有什么可能呢?
我认为你真正要问的问题是"假设我做了一个产生不精确结果的计算,在数学上应该正好是2.0,但实际上略少;当我应用于floor该值时,我得到1.0而不是2.0- - 我怎么防止这个?"
这实际上是一个相当微妙的问题,没有一个"正确"的答案.你是如何计算输入值的?你打算怎么处理这个结果?
| 归档时间: |
|
| 查看次数: |
32307 次 |
| 最近记录: |