403 Stimmen

Wie rundet man das Ergebnis einer Integer-Division auf?

Ich denke insbesondere darüber nach, wie ich Paginierungssteuerelemente anzeigen soll, wenn ich eine Sprache wie C# oder Java verwende.

Wenn ich x Elemente habe, die ich in Abschnitten von y pro Seite anzeigen möchte, wie viele Seiten werden benötigt?

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.

2voto

H.M.Mubashir Punkte 128

Sie können verwenden

(int)Math.Ceiling(((decimal)model.RecordCount )/ ((decimal)4));

1 Stimmen

Was ist, wenn die Anzahl der Datensätze pro Seite etwas anderes als 4 beträgt?

1 Stimmen

Vielen Dank. Deine Antwort ist sehr hilfreich.

2voto

Sam Jones Punkte 4179

Ich mache folgendes, um Überläufe zu behandeln:

var totalPages = totalResults.IsDivisble(recordsperpage) ? totalResults/(recordsperpage) : totalResults/(recordsperpage) + 1;

Und verwende diese Erweiterung, wenn es 0 Ergebnisse gibt:

public static bool IsDivisble(this int x, int n)
{
           return (x%n) == 0;
}

Außerdem für die aktuelle Seitenzahl (wurde nicht gefragt, könnte aber nützlich sein):

var currentPage = (int) Math.Ceiling(recordsperpage/(double) recordsperpage) + 1;

0voto

flux Punkte 191

Alternative, um das Verzweigen beim Testen auf Null zu entfernen:

int pageCount = (records + recordsPerPage - 1) / recordsPerPage * (records != 0);

Nicht sicher, ob das in C# funktioniert, sollte in C/C++ funktionieren.

-1voto

Jeremy Hadfied Punkte 9

Eine generische Methode, deren Ergebnis Sie durchgehen können, könnte von Interesse sein:

public static Object[][] chunk(Object[] src, int chunkSize) {

    int overflow = src.length % chunkSize;
    int numChunks = (src.length / chunkSize) + (overflow > 0 ? 1 : 0);
    Object[][] dest = new Object[numChunks][];      
    for (int i = 0; i < numChunks; i++) {
        dest[i] = new Object[(i < numChunks - 1 || overflow == 0) ? chunkSize : overflow];
        System.arraycopy(src, i * chunkSize, dest[i], 0, dest[i].length); 
    }
    return dest;
}

0 Stimmen

Guava hat eine ähnliche Methode (Lists.partition(List, int)) und ironischerweise leidet die size() Methode der resultierenden List (seit r09) unter dem Overflow-Bug, der in Brandon DuRettes Antwort erwähnt wird.

-2voto

Jim Watson Punkte 1

Das Folgende sollte das Runden besser als die obigen Lösungen durchführen, aber auf Kosten der Leistung (aufgrund der Berechnung von 0,5*rctDenominator mit Gleitkommazahlen):

uint64_t integerDivide( const uint64_t& rctNumerator, const uint64_t& rctDenominator )
{
  // Stellen Sie sicher, dass .5 nach oben aufgerundet wird (sonst wird die Ganzzahldivision einfach abgeschnitten - gibt also keinen Rest)
  return (rctDenominator == 0) ? 0 : (rctNumerator + (int)(0.5*rctDenominator)) / rctDenominator;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X