Swift 斯威夫特三人不能通过243

Swift 斯威夫特三人不能通过243,swift,math,Swift,Math,我的项目任务是找出一个整数是否是三的幂。我的代码可以通过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(Dou

我的项目任务是找出一个整数是否是三的幂。我的代码可以通过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.999999。。。 所以模1失效是有意义的

如果将Double更改为Float,程序将正常工作

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

func log3(val: Float) -> Float

不过,一般来说,要检查int是否是3的幂,不应该将其更改为float或double。您应该将其保留为int。
log()
需要一个
Float
Double
,因此他无论如何都必须转换
int
。但我同意,投得越少越好。你们说得对!我只是想知道。我将分享我的解决方案。非常感谢你!我预计,在精度极限下,对
Float
进行强制转换将导致问题。从
Int
进行铸造会导致精度损失,因此应避免。特别是如果有一个非强制转换版本(
while(n%3==0)n/=3;返回n==1;
,或者只是预先计算适合
Int
的20个3的幂)。如果必须强制转换,请至少使用一个对浮点运算更健壮的版本:
pow(3,round(log3(Double(n)))==n
。有关详细信息,请参阅