java joptionpane beispiel - Warum gibt das Teilen eines Floats durch eine Ganzzahl 0.0 zurück?





3 Answers

n / 1024 ist eine Ganzzahldivision , die eine ganze Zahl ergibt (dh in diesem Fall 0).

Verwenden n / 1024.0 stattdessen n / 1024.0 .

showoptiondialog input showconfirmdialog

Also, wenn ich einen Bereich von Zahlen '0 - 1024' habe und ich möchte sie in '0 - 255' bringen, würde die Mathematik diktieren, die Eingabe durch das Maximum zu dividieren, das der Eingang sein wird (1024 in diesem Fall), was geben wird mir eine Nummer zwischen 0.0 - 1.0. dann multipliziere das mit dem Zielbereich (255).

Was ich machen möchte!

Aber aus irgendeinem Grund in Java (mit der Verarbeitung) wird immer der Wert 0 zurückgegeben.

Der Code wäre so einfach

float scale;
scale = (n/1024) * 255;

Aber ich bekomme nur 0.0. Ich habe es doppelt und int versucht. alles vergebens. WARUM!?




Sie sollten n automatisch in eine Float-Operation umwandeln, indem Sie die Multiplikation mit FIRST ausführen. Andernfalls führen Sie eine Integer-Operation durch und geben dann das Ergebnis aus, anstatt die Operation zwischen den Floats auszuführen.

float scale;
scale = n * 1.0 / 1024 * 255;



Andere haben bereits gute Antworten gegeben. Wenn Sie möchten, dass Ihre Skala eine ganze Zahl ist (was sinnvoll ist, wenn Ihr n bereits eine ganze Zahl ist), könnten Sie das tun

int scale = ((255 * n)/1024);

Beachten Sie, dass Sie damit keine Probleme bekommen, solange dies die Zahlen sind, da n * 255 immer in ein int passt, wenn das Maximum n = 1024 ist.

flexibler wäre

int scale(int value, int old_max, int new_max){
  java.math.BigInteger big_value = java.math.BigInteger.valueOf(value);
  java.math.BigInteger big_old_max = java.math.BigInteger.valueOf(old_max);
  java.math.BigInteger big_new_max = java.math.BigInteger.valueOf(new_max);
  java.math.BigInteger mult = big_value.multiply(big_old_max);
  return (int) mult.devide(big_new_max).doubleValue();
}

Sie werden auf diese Weise keine Ints überlaufen, obwohl ich zugeben muss, dass dies ein bisschen ausführlich ist

Bearbeiten:

Grundsätzlich gleich, aber weniger klobig (obwohl bei sehr hohen Zahlen einige Präzessionsfehler auftreten können)

int scale(int value, int old_max, int new_max){
  double factor = (double) new_max / (double) old_max;
  return factor * value;
}



Related