2016-04-13 6 views
0

Ich habe einige for-Schleife, die einige Schwimmer lokale Variablen erfordern:Können wir garantieren, float mit == zu vergleichen ist sicher, wenn der Float nur Integer-Werte enthält?

float price=0; 
float weight=0; 
int[] amountArray={2,5,3}; 
for(int i=0;i<=10;i++){ 
    int amount=0; 
    if(i<amountArray.length){ 
     amount=amountArray[i]; 
    } 
    //other codes for price and weight 
} 

ich den Preis und Gewicht wollen Schleife als lokale Variablen eingebettet in werden, damit ich die i von int zu schweben ändern:

int[] amountArray={2,5,3}; 
for(float i=0,price=0,weight=0;i<=10;i++){ 
    int amount=0; 
    if(i<amountArray.length){ 
     amount=amountArray[(int)i]; 
    } 
    //other codes for price and weight 
} 

Funktioniert die modifizierte Version identisch mit der ursprünglichen Version? Da ich nur ganzzahligen Wert, der durch IEEE 754-Standard korrekt dargestellt werden kann, und es hängt nicht von jeder Hardware (vor allem in Android), so denke ich Vergleich Float mit <, < =, == und Casting zu Int sind nicht ein Problem in diesem Fall, bin ich richtig?

+2

Genauigkeitsprobleme sind nicht nur ganzzahlig oder nicht ganzzahlig, sondern auch wichtig, wie groß die Ganzzahl wird. –

+0

* "Ich möchte, dass der Preis und das Gewicht in for loop als lokale Variablen eingebettet werden" * Dieser Stil ist tatsächlich schlechter. Kompakter Code ist nur gut, wenn er nicht dicht ist. Eine Tonne Müll in dieselbe Zeile zu drücken, macht es nur schwer lesbar. Und der Teil, wo Sie 'i' werfen müssen, um auf das Array zuzugreifen, ist einfach schrecklich. Wirklich, mach es einfach so. – Radiodef

+0

Erwägen Sie, "Preis" intern in Cent anstelle von Dollar zu berechnen. Auf diese Weise haben Sie überhaupt keinen Fließkommawert. Dann können Sie vor dem Ausdrucken des Endpreises "durch 100 teilen". – selbie

Antwort

2

Es hängt davon ab, wie groß die ganze Zahl ist. A float hat 23 Bits für die Mantisse, und es wird immer angenommen, dass das Bit links von der Mantisse 1 ist. Das bedeutet, dass jede positive ganze Zahl, deren Wert in 24 Bits passen kann, genau dargestellt werden kann. Aber wenn eine ganze Zahl größer ist, gibt es nicht genug Bits.

Für eine Demonstration, versuchen http://www.adambeneschan.com/How-Does-Floating-Point-Work/showfloat.php?floatvalue=30000001&floattype=float besuchen, die das zeigt, wenn Sie versuchen, die Nummer 30000001 als float darzustellen, wird es tatsächlich den Wert 30000000. Offensichtlich == nicht auf ganze Zahlen gehen zu arbeiten, die so hoch sind.

+2

Es gibt 23 gespeicherte Bruchbit, plus ein implizites Bit für normale Zahlen, insgesamt 24 Bits, nicht 25. –

+0

@ PatriciaShanahan Aaargh, vergaß das Vorzeichenbit. Danke für die Korrektur. – ajb