Swift的部门在Swift中不准确

时间:2014-10-01 16:07:00

标签: swift floating-point

我有这个功能:

extension Float {
    func shortenDecimals() -> Float {
        println(self)

        let a = self * 10.0
        println(a)

        let b = round(a)
        println(b)

        println(b/10.0)
        return b / 10.0
    }
}

这个函数应该做的是返回一个带有1个十进制的浮点数

这是打印出来的:

self        :   0.0833333358168602
self * 10   :   0.833333373069763
round(a)    :   1.0
b/10        :   0.100000001490116

我发现这非常令人沮丧,为什么它不会返回0.1?

1 个答案:

答案 0 :(得分:3)

0.5是唯一一个“带有1位小数”的浮点数。当以十进制表示时,所有其他小数浮点数在点后面都有更多位数,因为浮点数的表示是二进制,而不是十进制。

二进制和十进制系统在表示整数时是等效的(它们都可以表示所有整数),但在表示小数值时则不然。以十进制表示的简单值绝对不能用二进制表示。此一般规则的例外情况为0.25,0.5,0.75,0.125,但 0.1,这在二进制中无法准确表示。 0.100000001490116显示Float必须提供的最佳近似值的第一个数字。