# Java Mathe Operationen?



## lam_tr (24. Nov 2010)

Guten morgen zusammen,

irgendwie habe ich ein Verständnisproblem mit den Datentypen int und double.

Wenn ich beispielsweise:

```
double ergebnis = 1/3;
```

möchte ich gerne 0,333333333333333333 bekommen.
Aber er gibt mir 1.0 raus, d.h. da 1 und 3 ein Int ist verrechnen die das als Int und konvertiert es zu Double?


```
double ergebnis = 1.0/3.0;
```

so funktionierts.

und zum anderen, wenn ich x^1/3 machen will, wie geht das?

Ist es generell mit Mathematischen Formeln von links nach rechts?
weil Punkt vor strich klappts auch nicht.

```
System.out.println(2+1/3*3);
```

gruss lam


----------



## nrg (24. Nov 2010)

der compiler interpretiert 1 2 oder was auch immer als integer. int / int = int. wenn du aber 1. 2.0 oder 1d schreibst, wird die zahl als double interpretiert und auch richtig gerechnet.

edit: letzten 2 Punkte übersehen. Punkt vor Strich funktioniert. Wenn du das nicht willst, musst du eben Klammern. Exponenten rechnest du entweder selbst in einer Schleife oder mit Math (Math (Java Platform SE 6))


----------



## Tomate_Salat (24. Nov 2010)

der rechnet schon punkt vor Strich: *Edit* (so rechnet er es, wie du es erwarten würdest)

```
System.out.println(2+1d/3d*3d);
```

*Edit:* Zu deinem Code: [c]2+1/3*3[/c]:

was dich hier verunsichert hat, war das interne runden:
1/3 => 0.33333  ~> 0
0 * 3 = > 0
2 + 0 => 2

mfg

Tomate_Salat


----------



## Landei (24. Nov 2010)

lam_tr hat gesagt.:


> und zum anderen, wenn ich x^1/3 machen will, wie geht das?




```
Math.pow(x, 1.0/3.0);
```

Profi-Tipp: Wenn du vor deine Klasse ein


```
import static java.lang.Math.*;
```

schreibst, kannst du dir das Math. vor den Funktionen sparen, also abs(-5) statt Math.abs(-5), sin(1) statt Math.sin(1) u.s.w.


----------



## Landei (24. Nov 2010)

Tomate_Salat hat gesagt.:


> der rechnet schon punkt vor Strich:
> 
> ```
> System.out.println(2+1d/3d*3d);
> ...



Sorry, das ist Schwachfug: Bei 1d/3d wird nichts "intern gerundet". Wenn man int und double mixt, ist das Ergebnis immer ein double.

Was hier passiert ist, dass Operatoren gleicher Priorität von links nach rechts berechnet werden, also 1d/3d*3d als (1d/3d)*3d aufgefasst wird, was in etwa 1 ergibt, also das Gesamtergebnis 3.0 und nicht 2.0, wie du behauptest.
Um stattdessen zu 1/9 zu kommen kann man 1/3d/3d schreiben oder Klammern setzen: 1d/(3d*3d)


----------



## Tomate_Salat (24. Nov 2010)

@landei:
nope, falsch interpretiert: das 2+1d.... war als verbesserung gedacht ;-). Meine erklärung zur internen Berechnung war auf seine usrprüngliche Aussage bezogen.

*Edit* habe mal meinen Post überabeitet, damit das jz hoffentlich klarer ist, was ich Aussagen wollte.


----------



## lam_tr (24. Nov 2010)

ok, danke jungs, hat soweit funktioniert


----------



## Landei (24. Nov 2010)

@Tomate_Salat: OK, jetzt verstehe ich, was du meinst.


----------



## Andi_CH (24. Nov 2010)

Zu den Prioritäten und dem Typ:

sysout(2 / 3 + 4.0)  gibt erstaunlicherweise 4.0

Offensichtlich wird für jeden einzelnen Rechenschritt der Resultattyp einzeln festgelegt - Mensch staune bloss, ärgere dich nicht

(Ach ja -mir fällt noch ein optisches Kuriosum auf - warum ist / eine Punkt Operation?  :lol: )


----------



## nrg (24. Nov 2010)

was ist daran erstaunlich?

2/3 = int -> .66666 fällt weg
bleibt 0 + 4.0 = 4.0 

edit: für die genauen


----------



## Andi_CH (24. Nov 2010)

nrg hat gesagt.:


> was ist daran erstaunlich?
> 
> 2/3 = int -> .66666 fällt weg
> bleibt 0 + 4.0 = 4.0
> ...



Ich hab erwartet, dass der Datentyp für die ganze Formel festgelegt und dann mit diesem gerechnet wird...

Aber ich habe ja die für mich erstaunlich Feststellung formuliert -> "Offensichtlich wird für ......."

Und ich nehme an, dass das defintiv nicht allen klar was


----------

