如何获得浮点数的小数精度?

How do I get the decimal precision of a floating point number?

如何在Swift中获取浮点数的小数精度?所有现有答案都使用某种形式的字符串转换,效率低下。我是专门找一个不涉及字符串转换的方法。


这个问题是基于一个误解。感谢@MartinR 和@SimonByrne,我已经意识到并纠正了我的理解错误。

方法如下:

func getPrecision(valueFunction: (@autoclosure () -> Double)) -> Int
{
    let value = valueFunction()
    var tens: Double = 1.0
    var precision: Int = 0

    while (floor((value * tens) + 0.1) / tens) != value
    {
        tens *= 10
        precision++
    }

    return precision
}

编辑:正如 Simon Byrne 正确指出的那样,这个答案是错误的。

正如其他评论者所指出的那样,实际上并没有像 "decimal precision" 这样的浮点数:当你写类似 x = 0.123 的东西时,你实际上是在设置 [=11] =] 是最接近 0.123 的双精度浮点数,实际上是:

0.1229999999999999982236431605997495353221893310546875

根据您提出的答案,您的问题将更准确地表述为计算浮点数 近似值 的最小小数位数。

为此,您的代码对于 "reasonable" 值应该是正确的,但如果您的小数位数超过 22 位,您可能会看到一些错误,因为 tens 变量将不再准确(10 23 无法用双精度浮点数精确表示)。有关这方面的更多详细信息,您应该阅读二进制到十进制的转换:我建议您查看 Rick Regan 的网页: http://www.exploringbinary.com/tag/convert-to-decimal/