2016-05-03 5 views
1

Ich plane das Schreiben eines 3rd-Party-Skripts, das ein Bewertungssystem für eine Webseite erlaubt, aber ich möchte nur, dass jede eingebettete Webseite eine Zeile in einer Datenbank (oder genauer gesagt ein Dokument, seit ich NoSQL nehme) aufnimmt Route). Mein Pseudo-Code für die Bewertung wird wie folgt aussehen:Wird dieser Algorithmus Trunkierungsfehler akkumulieren?

function update(page, rate) { 
    collection.get({ 
    page: page 
    }, function callback(err, doc) { 
    if (!err) { 
     var rating = doc.rating, 
     votes = doc.votes; 

     collection.update({ 
     page: page 
     }, { 
     votes: votes + 1, 
     rating: (rating * votes + rate)/(votes + 1) // here's the iffy part 
     }); 
    } 
    }); 
} 

Gibt es einen Weg, um den Algorithmus zu verbessern, um für Gleitkommazahlen Rundungsfehler zu vermeiden, oder wird dies kein Problem in erster Linie sein?

+0

Sind nicht alle JS-Nummern Gleitkomma? – stark

+0

Ja, sie sind ... Ich frage, ob dieses Programm im Laufe der Zeit Trunkierungsfehler akkumulieren würde, da es den Durchschnitt multipliziert und die Summe bei jeder Aktualisierung teilt. –

Antwort

1

Gibt es eine Möglichkeit, den Algorithmus zu verbessern, um Trunkierungsfehler für Fließkommawerte zu vermeiden, oder wird dies überhaupt kein Problem sein?

Ja. Speichern Sie die Summe aller Bewertungen und die Anzahl der Bewertungen als Ganzzahlen in der Datenbank und berechnen Sie nur den Durchschnitt daraus, wenn Sie sie anzeigen.

Verwandte Themen