2010-09-23 5 views
37

Also wenn ich einen Bereich von Zahlen '0 - 1024' habe und ich möchte sie in '0 - 255' bringen, würde die Mathematik vorschreiben, die Eingabe durch das Maximum zu dividieren (1024 in diesem Fall) wird mir eine Zahl zwischen 0.0 - 1.0 geben. dann multipliziere das mit dem Zielbereich (255).Warum teilt ein float durch eine Ganzzahl 0.0?

Was ich machen möchte!

Aber aus irgendeinem Grunde in Java (mit Processing) Es wird immer einen Wert von 0

Der Code zurückkehren würde, da diese

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

Aber ich bekomme so einfach nur 0,0. Ich habe es doppelt und int versucht. alles vergebens. WARUM!?

+2

'n' auch als' float' definiert werden müssen. –

+1

n muss nicht float sein, nur numerisch. aber 1024 muss float/double (1024.0) – KevinDTimm

Antwort

68

Es ist, weil Sie Integer-Division machen.

Teile durch ein Doppel- oder ein Schwimmer, und es wird funktionieren:

double scale = (n/1024.0) * 255 ; 

Oder, wenn Sie es als Schwimmer wollen,

float scale = (n/1024.0f) * 255 ; 
+1

Vielen Dank für die Antwort! :) –

19

n/1024 Integer-Division, was ergibt eine ganze Zahl (dh. 0 in diesem Fall).

Verwenden Sie stattdessen n/1024.0.

+0

+1 weil es besser ist als meine Antwort :) – Agos

+0

Vielen Dank für die Antwort! :) –

+0

Danke! Es klappt. n/1024.0f –

2

Sie sollten n automatisch auf Float mit Hilfe einer Multiplikation FIRST konvertieren, andernfalls machen Sie eine Integer-Operation und dann das Ergebnis, anstatt die Operation zwischen Floats zu tun.

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

ich n vermuten ist ein int. Da die Konstanten 1024 und 255 beide int sind, werden alle Berechnungen auf der rechten Seite mit Ganzzahlarithmetik durchgeführt. Das bedeutet, dass das Ergebnis von n/1024 auf einen ganzzahligen Wert gekürzt wird, bevor es mit 255 multipliziert wird.

Jede dieser Änderungen werden die Berechnungen korrekt funktionieren machen:

scale = n/1024.0 * 255.0;  // Use double constants. 
scale = (double) n/1024 * 255; // Convert n to a double. 
scale = n * 255/1024;   // Multiply before dividing. 

Die letzte verwendet immer noch integer math aber die Reihenfolge der Schaltvorgänge bedeutet, dass Sie nicht die unerwünschte Verkürzung auf 0 erhalten Sie über Erhalten Sie trotzdem nur ganzzahlige Antworten, so dass Sie alle Dezimalstellen in den Antworten verlieren.

+0

Vielen Dank für die Antwort! :) –

2

In Ihrem Fall n/1024 Ergebnisse in 0, wie Sie integer Division tun. Um dies zu überwinden, können Sie n in float umwandeln. Dies ergibt ein Ergebnis zwischen 0.0 und 1.0 Als nächstes multiplizierst du mit 255 und wirfst das Ergebnis zurück auf Integer. Darüber hinaus müssen Sie scale als int

int scale; 
int n = 80; 
scale = (int)(((float)n/1024) * 255); 
2

andere tolle Antworten gegeben haben, bereits zu erklären.Falls Sie Ihre Waage wollen eine ganze Zahl sein (was Sinn macht, wenn Ihr n eine ganze Zahl ist schon), könnten Sie

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

Hinweis tun, dass Sie nicht mit dieser Probleme so lange getroffen werden, da diese die Zahlen werden seit n * 255 in einem int passen immer, wenn die maximale n = 1024.

flexibler

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 erhalten keine ints auf diese Weise überlaufen würde, obwohl ich zugeben, dies ist ein bit verbose

Edit:

Basicly die gleichen, aber weniger klobig (wenn auch für sehr hohe Zahlen, die Sie in einigen precission Fehler führen könnte)

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

Heh, deshalb hasse ich BigInteger und BigDecimal. –

Verwandte Themen