Die Konvertierung in Gleitkommazahlen und zurück scheint auf der CPU-Ebene eine enorme Zeitverschwendung zu sein.
Ian Nelsons Lösung:
int pageCount = (records + recordsPerPage - 1) / recordsPerPage;
Kann vereinfacht werden zu:
int pageCount = ((records - 1) / recordsPerPage) + 1;
AFAICS hat dies nicht das Überlaufproblem, das Brandon DuRette darauf hingewiesen hat, und da es nur einmal verwendet wird, müssen Sie die recordsPerPage nicht extra speichern, wenn es von einer teuren Funktion kommt, um den Wert aus einer Konfigurationsdatei oder Ähnlichem abzurufen.
D.h. dies könnte ineffizient sein, wenn config.fetch_value eine Datenbankabfrage oder Ähnliches verwendet:
int pageCount = (records + config.fetch_value('records per page') - 1) / config.fetch_value('records per page');
Dies erstellt eine Variable, die Sie nicht wirklich benötigen und die vermutlich (geringe) Speicherimplikationen hat und einfach zu viel Tipparbeit ist:
int recordsPerPage = config.fetch_value('records per page')
int pageCount = (records + recordsPerPage - 1) / recordsPerPage;
Dies ist alles in einer Zeile und ruft die Daten nur einmal ab:
int pageCount = (records - 1) / config.fetch_value('records per page') + 1;
1 Stimmen
Fehlt mir etwas? y/x + 1 funktioniert gut (vorausgesetzt, Sie wissen, dass der /-Operator immer abrundet).
69 Stimmen
@ rikkit - wenn y und x gleich sind, ist y/x + 1 auch eins zu hoch.
1 Stimmen
Für alle, die dies gerade erst entdecken, antwortet diese Antwort auf eine doppelte Frage überflüssige Konvertierungen in doppelte und vermeidet Überlaufprobleme, zusätzlich zu einer klaren Erklärung.
3 Stimmen
@IanNelson allgemeiner, wenn
x
durchy
teilbar ist, wärey/x + 1
auch eine zu hohe Zahl.1 Stimmen
@ZX9 Nein, es vermeidet keine Überlaufprobleme. Es handelt sich genau um dieselbe Lösung, die Ian Nelson hier gepostet hat.