程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Swift - 浮点值作为字典中的键?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Swift - 浮点值作为字典中的键??

开发过程中遇到Swift - 浮点值作为字典中的键?的问题如何解决?下面主要结合日常开发的经验,给出你关于Swift - 浮点值作为字典中的键?的解决方法建议,希望对你解决Swift - 浮点值作为字典中的键?有所启发或帮助;

是的,我已经完成了我的研究,我能找到的最接近我的问题的页面是: this page 而且一点帮助也没有。

也就是说,Swift 字典中使用浮点值作为键是否安全(可靠)?具体来说,CGfloat,Apple 文档说它实际上是 64 位系统上的 Double。

P.s. (这很重要) - 我的 CGfloat 值将总是以 .0 或 .5 作为小数部分结束。示例 - 13、13.5、14、14.5 等。这会影响此类字典查找的可靠性吗?

var Dictionary: [CGfloat: MyObject] = [:]

...

// Could this type of lookup fail ?
if let mappedobject = DictionarY[13.5] {
   ...
}

我有一个独特的用例,需要将某些对象映射到这些 CGfloat 值以便以后快速查找。

根据我的单元测试经验,我知道 XCTAssertEqual 在比较两种浮点类型时有时会失败,而不使用“accuracy”参数。因此,我担心使用 CGfloats 作为键会导致后续查找失败,因为传入的键可能会偏离 0.0000000001 或类似的值,因为浮点类型的底层表示。

谢谢。


编辑 -(感谢@sweeper)是的,我确实想到通过使用以下转换将 CGfloat 转换为 Int 来使用 Int 键:

intKey = Int(lroundf(float(cgfloatKey * 2.0))

但是,我担心这种 ^ 转换(必须在每次查找时完成)需要足够的开销以使其不值得。

我在这里可能完全错了,也许这些操作是闪电般的。任何人都可以评论每次执行查找时这种操作的效率吗?

解决方法

您的担忧是有道理的,您知道 XCTAssertEqual 可能由于浮点值的工作方式而无法给​​出预期的结果,因此使用浮点值作为键会遇到与键查找依赖于相等性相同的问题.

想想另一种方法,比如使用合适的整数值作为键。

,

XCTAssertEqual 在比较浮点数据时不会失败。当且仅当参数不相等时才会产生失败,这是正确的行为。

如果参数不相等,但如果用精确的数学计算会相等,这是因在某些先前的运算中存在舍入错误,而不是在 XCTAssertEqual 中。对浮点数的关注在于,它们的算术运算和数学函数是对实际算术的近似,因此计算结果可能与精确数学所需的理想结果不同。因此,不能使用 XCTAssertEqual 来确保使用近似值计算的两个结果相等,而实际上由于近似值而它们可能不相等。其原因完全在于算术近似,而不在于 XCTAssertEqual 的行为。

如果您的值的小数部分始终为 0 或 ½,则这些问题不适用(除非您的数字可能相差很大,例如生成 13½ 而不是 13)。因此,如果您的数字始终是您想要的确切值,则无需担心算术近似,它们将适合用作字典键。

大佬总结

以上是大佬教程为你收集整理的Swift - 浮点值作为字典中的键?全部内容,希望文章能够帮你解决Swift - 浮点值作为字典中的键?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。