2016-05-17 3 views
1

Meine Projektmission ist herauszufinden, ob eine ganze Zahl die Potenz von drei ist. Mein Code kann 0, 1, 3,9,27,81 Testfälle, aber 243 übergeben. Und wenn ich versuche, zum Debuggen auszudrucken, fand ich eine komische Sache. Wenn ich 243 eingabe, drucke ich log3 (243), es gibt mir 5.0, was korrekt ist. Aber ich habe versucht, log3 (243)% 1 zu drucken, es gibt mir 0,999999999999, was so komisch ist.Swift isPowerofThree kann nicht passieren 243

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) 
+1

http://stackoverflow.com/questions/4915462/how-should-i-do-floating-point-comparison –

+0

Ausführliche Informationen hierzu finden Sie unter [Was jeder Informatiker wissen sollten über Gleitkommatypen Arithmetik] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – NobodyNada

Antwort

3

Dies ist aufgrund der Präzision von Double. Zahlen, die im Binärformat codiert sind und irgendwann die von Ihnen erwartete Genauigkeit nicht erreichen.

Ich habe versucht, Ihr Programm und log3 (243) geben Sie mir 4.9999999 ... So macht es Sinn, die Modulo 1 fehlschlagen.

Wenn Sie Double in Float ändern, wird Ihr Programm funktionieren.

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

func log3(val: Float) -> Float 
+1

Im Allgemeinen, um zu überprüfen, ob ein int eine Potenz von 3 ist, sollten Sie es nicht zu a ändern schwimmen oder ein Doppel. Sie sollten es einfach als Int verlassen. – Teepeemm

+0

'log()' braucht ein 'Float' oder' Double', also muss er 'Int' trotzdem werfen. aber ich stimme dir zu, weniger du bist besser dran. – sonique

+0

Ja. Ihr habt recht! Ich finde es einfach heraus. Ich werde meine Lösung teilen. Ich danke dir sehr! – Tang

Verwandte Themen