这个问题已经有了答案:
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/