• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

java - komischer double/modulo ausgabewert

Mitglied seit
27.12.2004
Beiträge
9.431
Reaktionen
16
bin da auf etwas gestoßen, das ich nicht verstehe. habe mal ein minimalbeispiel gemacht:
Code:
class modtestbla
{
public static void main (String[] args)
	{
	double a=-143.8%1;
	System.out.println(a);
	}
}

-->
rQWHdzT.png


was sollen die 114 am ende, und wo kommen sie her?
 
Mitglied seit
09.01.2011
Beiträge
30
Reaktionen
0
Liegt warscheinlich an der Darstellung von Fließkommazahlen im Rechner. Genaue Ergebnisse kannst du da nicht erwarten. Deshalb auch Vorsicht bei Vergleichen von Fließkommazahlen mit dem == Operator!

Achja, die -0.8 sollte dich eigentlich auch wundern(außer du weißt es schon).
http://www.mathe24.net/modulo.html?action=do

Die Java Version des Modulo Operators ist mathematisch nicht korrekt (was mir vor einiger Zeit irgendwo nen hässlichen Bug beschert hat..)

Siehe dazu auch https://de.wikipedia.org/wiki/Division_mit_Rest
 

zhxb

Casino Port Zion, Community-Forum, SC2 Kontaktbörs
Mitglied seit
24.06.2005
Beiträge
2.647
Reaktionen
0
Ort
Berlin
Wenns praeziser sein soll: BigDecimal.

edit: too slow
 
Mitglied seit
12.04.2011
Beiträge
2.850
Reaktionen
0
Fury, wo bugt da der Modulo rumm? Ich verstehs ned so ganz :(
 
Mitglied seit
09.01.2011
Beiträge
30
Reaktionen
0
Ich gehe mal davon aus, dass du das Verhalten des Modulo meinst und nicht die komischen Nachkommastellen am Ende.

Gib die Operanden, die Ancient angegeben hat mal in meinem ersten Link ein. Der Modulo auf dieser Seite verwendet die tatsächliche mathematische mod Operation. Java verwendet eine andere Operation, auf Wiki wird sie als symmetrisch bezeichnet.

Die Funktionen sind auf Wiki etwas kompliziert definiert, ich versuch die mal in die Schulversion zu bringen:

mod(a,b) = a - "die größte ganze Zahl kleiner oder gleich (a / b)" * b

Das macht für mod(-143.8, 1) dann -143.8 (-144) * 1 = 0.2

%(a,b) = a - b * "das abgerundete Ergebnis von a/b"

und damit %(-143.8, 1) = -143.8 - 1 * (-143) = -0.8
 

Annihilator

Techniker
Mitglied seit
28.09.2002
Beiträge
7.821
Reaktionen
2.197
Und noch ein Beispiel zum Runden:
-0.8 wird als float (nicht double) dargestellt als (Vorzeichen, Exponent, Mantisse):
1 01111110 10011001100110011001101

Rechnest du das wieder in eine Dezimalzahl zurück bekommst du eben den Fehler am Ende rein.
1 oder 0.5 dagegen lassen sich z.B. exakt als Gleitkommazahl darstellen.
 
Oben