2008-10-30 12 views
8

Ich habe ein Menü von Produktmarken, die ich über 4 Spalten teilen möchte. Also, wenn ich 39 Marken habe, dann möchte ich die maximale Stückzahl für jede Spalte auf 10 (mit einer einzelnen Lücke in der letzten Spalte. So berechne ich die Artikelanzahl für eine Spalte (mit C#):Ganzzahl Mathe in C#

int ItemCount = Convert.ToInt32(Math.Ceiling(Convert.ToDecimal(BrandCount)/4m)); 

dass alle Umwandlung scheint mir wirklich hässlich gibt es einen besseren Weg, Mathe auf ganze Zahlen in C# zu tun

Antwort

21

Sie werfen kann.?.

Auch, weil int/decimal Ergebnisse in einem decimal Sie eines des Abgüsse entfernen:

int ItemCount = (int) Math.Ceiling(BrandCount/4m); 
+0

Das war, was ich schreiben wollte. +1. – OregonGhost

+0

Es ist was ich geschrieben habe. :) +1 auch. –

+0

Wow, das ist so viel sauberer. Vielen Dank. –

7

eine längere Alternative mit Mod

ItemCount = BrandCount/4; 
if (BrandCount%4 > 0) ItemCount++; 
+2

Längerer? Einfacher! +1 – Treb

2

Vielleicht so etwas wie dies versuchen ... BrandCount Unter der Annahme, eine ganze Zahl. Sie haben immer noch die gleichen Abgüsse, aber es könnte klarer sein:

int ItemCount = (int)(Math.Ceiling(BrandCount/4m)); 

Ich bin kein großer Fan der Convert Klasse, und ich vermeiden, wann immer möglich. Es scheint immer meinen Code unleserlich zu machen.

+0

Ich stimme dir völlig zu -> Convert.ToInt32 (foo) ist hässlich im Vergleich zu (int) foo. –

+0

Macht die Besetzung genau das gleiche wie die Convert? –

+1

@ Ben Mills: In diesem Fall ja (Konvertieren von Zahlen). Im Allgemeinen, nein. – OregonGhost

10

Warum verwenden Sie sogar eine Dezimalzahl?

int ItemCount = (BrandCount+3)/4; 

Die +3 stellt sicher, dass Sie aufrunden, anstatt nach unten:

(37+3)/4 == 40/4 == 10 
(38+3)/4 == 41/4 == 10 
(39+3)/4 == 42/4 == 10 
(40+3)/4 == 43/4 == 10 

Allgemein gilt:

public uint DivUp(uint num, uint denom) 
{ 
    return (num + denom - 1)/denom; 
} 
+2

Ich mag den Trick, aber ich denke, es ist schwieriger, den Zweck des Codes zu sehen. Die Antwort, die ich angenommen habe, ist leicht zurückzukommen und aufrechtzuerhalten. –

+0

Sie nennen * diesen * einen Trick? Ich beneide dich nicht, wenn du versuchst, irgend etwas außer den einfachsten Programmen beizubehalten ... – Motti

+6

seriös - ceil (a/b) = ((a + b-1)/b) ist ein "Trick", den Programmierer benutzt haben Jahre vor C#. – cce