我在我的项目中使用浮点值。当我尝试在 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/