Warum java + = falsches Ergebnis bekommen, und wie kann ich das verhindern?

8

Warum java += falsches Ergebnis erhalten und wie kann ich dieses Problem verhindern? (Zum Beispiel irgendeine Weise warning in der IDE zeigen?)

Ich habe Eclipse & amp; IntelliJ aber beide zeigen keine Warnung.

Beispielcode:

%Vor%     
andyf 02.06.2016, 02:47
quelle

3 Antworten

10

Nach dem JLS zusammengesetzter Zuordnungsausdruck

%Vor%

entspricht

%Vor%

Da b ein double ist, binäre numerische Werbung erfolgt vor dem Hinzufügen. Beide Operanden werden in double -Werte konvertiert und die Addition erfolgt mit Fließkomma-Arithmetik.

Der Wert 20000000000000090 kann nicht genau als double dargestellt werden. Daher verlieren Sie die Genauigkeit und erhalten stattdessen 20000000000000088 . Es wird dann in ein long zurückversetzt, das genug Genauigkeit hat, um 20000000000000088 darzustellen.

Ihr zweites Snippet erzeugt 10000000000000090 , das genau als double dargestellt werden kann.

Ihr drittes Snippet entspricht

%Vor%

die Ganzzahlarithmetik verwendet. 20000000000000090 kann als long dargestellt werden.

Ich kenne keine Werkzeuge, um Sie davor zu warnen.

Verwandte:

Sotirios Delimanolis 23.05.2017, 10:29
quelle
1

Java verwendet 64-Bit-IEEE-Gleitkommazahlen , die 53 Binärziffern zur Darstellung der signifikanten Zahl verwenden. Im ersten Beispiel

%Vor%

Hier wird die Variable a in ein Double konvertiert, das einen Exponenten größer als 1 verwenden muss, um es darzustellen, und es wird nicht länger eine exakte Repräsentation des Wertes 2000000000000000000L sein.

In diesem Beispiel ist es möglich, a nur mit dem Signifikanden und einem Exponenten von 1 darzustellen.

%Vor%

In diesem Beispiel wird b explizit in long konvertiert, sodass a nicht in Double umgewandelt werden muss und Gleitkommaarithmetik ausgeführt werden muss.

%Vor%     
Josh 02.06.2016 03:15
quelle
0

Da nicht jeder Programmierer (wie ich) binäre numerische Werbung ,

Um zu verhindern, dass diese += -Kodierung fehlt, habe ich einen einfachen Weg gefunden: verbiete einfach alle += als Kodierungsregel.

Ich greife nur alle += in meinen Projekten an und ändere a += b in a = a + b .

IDE zeigt Fehler an, während Typ nicht übereinstimmt, während + Operation, wie unten:

    
andyf 02.06.2016 05:28
quelle

Tags und Links