Java - Wie überprüft man, ob eine Division eine Ganzzahl oder ein Gleitkomma ist?

8

Ich könnte mir keinen besseren Titel vorstellen. Nun, das Problem ist: Ich habe das "int i", es kann einen beliebigen Wert haben. Mein Ziel ist es, das "int i" in die nächste durch 16 teilbare Zahl zu transformieren.

Zum Beispiel habe ich i = 33 . Dann werde ich zu 32 (16x2) gedreht. Aber wenn ich i = 50 bekomme, wird es zu 48 (16x3) .

Ich habe viele Dinge zum Beispiel ausprobiert:

%Vor%

Aber ich weiß nicht, wie man überprüft, ob es eine ganze Zahl ist. Vielleicht funktioniert mein vorheriger Code, aber ich muss nur einen Weg finden, um zu überprüfen, ob es eine Ganzzahl oder ein Gleitkomma ist. Also ... jede Hilfe wird geschätzt.

    
user1541106 23.08.2012, 18:40
quelle

7 Antworten

5

Da alle Ints, die durch 16 teilbar sind, ihre letzten 4 Bits haben, werden alle auf 0 gesetzt. Sie können erreichen, was Sie wollen, ohne eine Schleife oder sogar eine if-Anweisung:

%Vor%

Zum Beispiel:

%Vor%     
Paulpro 23.08.2012, 20:01
quelle
12

Benutze den Mod-Operator. Mod gibt Ihnen den Rest einer Divisionsoperation.

%Vor%     
Will Hartung 23.08.2012 18:44
quelle
4

(i - x)/16 ist eine Ganzzahl, wenn der Rest von (i - x)/16 0 ist. Verwenden Sie% (Modulus) wie:

%Vor%     
Nandkumar Tekale 23.08.2012 18:42
quelle
4

Es gibt einige auffällige Probleme mit Ihrem ursprünglichen Code:

  1. Wenn Sie auf das nächste Vielfache von 16 runden, folgt daraus, dass der höchste Wert, den Sie möglicherweise abziehen müssen, 15 ist. Daher sollte die obere Grenze Ihrer Schleife höchstens 15 betragen.
  2. Wie andere bemerkt haben, könnten Sie den Modulo-Operator ( % ) verwenden, um den genauen Wert zu bestimmen, der von einem gegebenen Wert abgezogen wird, um ihn auf das nächste Vielfache von 16 abzurunden / li>
  3. Aber da 16 eine Potenz von 2 ist, und da ganze Zahlen als eine binäre Zahl mit 32 Ziffern (dh 32 Bits) dargestellt werden, können Sie den Wert direkter berechnen, indem Sie eine Bitmaske verwenden, um alle Ziffern kleiner als 16 zu löschen Nummer. In Java können Sie die binäre & amp; Operator für diesen Zweck wie folgt: i & 0xfffffff0 . Dadurch werden die letzten 4 Ziffern (die für 8-4-2-1 stehen) auf Null gesetzt, wodurch Ihre Zahl effektiv auf den nächsten durch 16 teilbaren Wert abgerundet wird.
  4. Wenn Sie eine ganzzahlige Division der Zahl durchführen und jeden Rest ignorieren müssen, können Sie einfach ( >> ) um 4 Bits verschieben, um dies stattdessen zu tun.
user268396 23.08.2012 18:53
quelle
1

Um herauszufinden, ob eine Zahl eine andere gleichmäßig verteilt, sehen Sie sich die anderen Antworten an. Modulo (%) ist die Methode dafür.

Um das zu tun, was Sie tun wollen, brauchen Sie keine Schleife:

%Vor%

Das wird 48 zurückgeben, wenn Sie es 50 wie Ihr Beispiel geben.

Wenn Sie nearest wirklich wollen, müssen Sie eine Gleitkomma-Division machen

%Vor%

Nun gibt 46 zurück 48, 149 gibt 144 usw. zurück.

    
xbakesx 23.08.2012 18:53
quelle
0

Wenn Sie das nächste Vielfache von 16 benötigen, dann haben Sie zwei Fälle, um mit ungeraden Vielfachen von 8 umzugehen.  1. 8 wird 16, 24 wird 32  2. 8 wird 0, 24 wird 16

Für den ersten:

%Vor%

Im zweiten Fall:

%Vor%

Wenn Sie immer abrunden wollen (d. h. 17 wird 16 und 15 wird 0):

%Vor%

Wenn Sie immer aufrunden wollten (nicht das, was Ihr Beispiel sagt), hätten Sie das stattdessen getan:

%Vor%     
Rajesh J Advani 23.08.2012 19:54
quelle
0

Um zu überprüfen, ob eine zufällige Division zu einer Ganzzahl oder einem Bruch führt, benötigen Sie Folgendes:

%Vor%

Sie können dies als Alternative tun:

%Vor%

Man benötigt Math.ceil () und nicht round oder floor, weil eine ganzzahlige Division fast gleich einem floor ist und der Bruch abgerundet wird und als 'integer division' erscheint.

    
RabbitBones22 06.02.2017 15:57
quelle

Tags und Links