这个问题已经有了答案:
How should I do floating point comparison?
11个答案
Swift: Double conversion inconsistency. How to correctly compare Doubles?
3个答案
我的项目任务是找出一个整数是否是三的幂。我的代码可以通过0,1,3,9,27,81个测试用例,但是243个。
当我试着打印出来调试时,我发现了一件奇怪的事情。当我输入243时,我输出log3(243),它给出5.0,这是正确的。但我试着打印log3(243)%1,它给了我0.999999999,这太奇怪了。

class Solution {
func isPowerOfThree(n: Int) -> Bool
{
    //print("log3(n): \(log3(Double(n)))")

    if n == 0
    {
        return true
    }

    if n == 1
    {
        return true
    }

    //print("weird here: \(log3(Double(n)) % 1)" )

    if log3(Double(n)) % 1 == 0.0
    {

        return true
    }
    //print("log3: \(log3(Double(n)))")
    //print("floor log3: \(floor(log3(Double(n))))")
    //print("log3: \(Int(log3(Double(n))))")
    return false
}

func log3(val: Double) -> Double
{
    return log(val)/log(3.0)
}

}

var test = Solution()
var result = test.isPowerOfThree(243)
print(result)

最佳答案

这是由于双精度。以二进制格式编码的数字,并且在某个点上无法达到预期的精度。
我试过你的程序,log3(243)给我4.99999999…
所以模1失败是有道理的。
如果将double改为float,则程序将工作。

if log3(Float(n)) % 1 == 0.0

func log3(val: Float) -> Float

关于swift - swift isPowerofThree无法通过243 ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37265223/

10-09 09:41