ios - 为什么 float 值在 playground 中四舍五入而不是在 Swift 的项目中?

标签 ios swift xcode floating-point

我在我的项目中使用浮点值。当我尝试在 Project 中访问时,它会扩展到 1/billions decimal,但当涉及到 playground 时,它工作得很好。

在 xcodeproj 中:

let sampleFloat: Float = 0.025
print(sampleFloat)  // It prints 0.0250000004

在 Playground 上:

let sampleFloat: Float = 0.025
print(sampleFloat)  // It prints 0.025

知道这里发生了什么吗?如何避免在 xcodeproj 中扩展?

最佳答案

很多评论,但还没有人发布所有信息作为答案。

答案是,在内部, float 用 2 的二进制幂表示。

以 10 为基数,十位数字表示值中有多少个 1/10。百分位表示值中有多少个 1/100,千位表示值中有多少个 1/1000,依此类推。在基数 10 中,您不能准确表示 1/3。即 0.33333333333333333...

在二进制 float 中,第一个小数位二进制数表示数值中有多少个1/2。第二个数字表示值中有多少个 1/4,下一个数字表示值中有多少个 1/8,依此类推。有一些(很多)十进制值不能用二进制 float 精确表示。值 0.1 (1/10) 就是这样一个值。这将近似为 1/16 + 1/32 + 1/256 + 1/512 + 1/4096 + 1/8192。

值 0.025 是另一个无法用二进制 float 精确表示的值。

还有一种替代数字格式,NSDecimalNumber(Swift 3 中的Decimal),它使用十进制数字来表示数字,因此它可以准确地表示任何十进制值。 (请注意,它仍然不能准确地表达像 1/3 这样的分数。)

关于ios - 为什么 float 值在 playground 中四舍五入而不是在 Swift 的项目中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45091360/

相关文章:

ios - 对 NSDictionary 的 NSArray 进行排序...未完全正常工作

ios - Alamofire 错误 : Operation couldn't be completed. 软件导致连接中止

iOS UI 旋转器在处理后台线程时卡住

ios - 可观察的选择器 - RxSwift

ios - 如何导航回 tvOS?

iOS - 保存的文件丢失

cocoa-touch - 加载 UITableView 时崩溃

xcode - iOS-在具有参数的按钮上调用选择器

swift - 当 UIScreen 亮度改变时添加动画淡入淡出效果(Swift)

iphone - 如何更改选定的文本颜色?