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:
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.
In diesem Beispiel wird b
explizit in long konvertiert, sodass a
nicht in Double umgewandelt werden muss und Gleitkommaarithmetik ausgeführt werden muss.
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:
Tags und Links java