App komische Werte entstehen

  • Antworten:15
  • Bentwortet
Evoh
  • Forum-Beiträge: 29

23.02.2014, 10:29:35 via Website

Hey...

ich programmiere immoment an einer kleinen App nur stehe ich vor einem Problem bzw. ich kann mir das nicht erklären, wie die Werte entstehen.

Hier mal mein Code:
1package de.evohgames.crapclickers;
2
3 import java.util.Timer;
4 import java.util.TimerTask;
5
6 import android.app.Activity;
7 import android.os.Bundle;
8 import android.util.Log;
9 import android.view.Menu;
10 import android.view.View;
11 import android.view.View.OnClickListener;
12 import android.widget.Button;
13 import android.widget.TextView;
14
15 public class MainActivity extends Activity implements OnClickListener{
16
17 private Button click;
18 private Button but1;
19 private Button but2;
20 private Button but3;
21
22 private double Gesamt = 0;
23 private double secondcount;
24 private double zaehler1;
25
26 @Override
27 protected void onCreate(Bundle savedInstanceState) {
28 super.onCreate(savedInstanceState);
29 setContentView(R.layout.activity_main);
30 click = (Button) findViewById(R.id.button1);
31 click.setOnClickListener(this);
32 but1 = (Button) findViewById(R.id.button2);
33 but1.setOnClickListener(this);
34 aktualisieren();
35 starteCount();
36 }
37
38
39 @Override
40 public boolean onCreateOptionsMenu(Menu menu) {
41 // Inflate the menu; this adds items to the action bar if it is present.
42 getMenuInflater().inflate(R.menu.main, menu);
43 return true;
44 }
45
46
47 @Override
48 public void onClick(View v) {
49
50 if(v.getId() == R.id.button1) {
51 Gesamt = Gesamt + 1.0;
52 aktualisieren();
53 }
54
55 if(v.getId() == R.id.button2) {
56 if(Gesamt >= (int) Math.pow(1, 1)*50) {
57 Gesamt = Gesamt - (Math.pow(1, 1)*50);
58 zaehler1 = zaehler1 + 0.1;
59 aktualisieren();
60 }
61 }
62 Secondcount = zaehler1;
63 aktualisieren();
64 }
65
66 private void starteCount()
67 {
68 new Thread(new Runnable() {
69 public void run(){
70 Count();
71 }
72 }).start();
73 }
74
75 private void Count() {
76 Timer timer = new Timer();
77 TimerTask task = new TimerTask() {
78 public void run(){
79 MainActivity.this.runOnUiThread(new Runnable() {
80 public void run() {
81 Gesamt = Gesamt + secondcount;
82 aktualisieren();
83 }
84 });
85 }
86 };
87 timer.schedule(task, 0, 1000);
88 }
89
90 public void aktualisieren(){
91 TextView secondcount = (TextView) findViewById(R.id.secondcount);
92 secondcount.setText(Double.toString(secondcount) + " Secondcount");
93 TextView Gesamt = (TextView) findViewById(R.id.Gesamt);
94 Gesamt.setText(Double.toString(Gesamt) + " Gesamt");
95 but1.setText(Integer.toString( (int) ( Math.pow(1, 1)*50)));
96 }
97 }

Also ich habe einen secondcount, der sich immer um 0.1 erhöht, wenn der Benutzer auf den Button drückt. Nur wenn der Wert von Secondcount 0.1 beträgt und dieser 3 Sekunden ausgeführt wird, ergibt Gesamt nicht wie zu erwarten 0.3 sondern 0.300000000000007, das kann ich mir nicht erklären :/ Das Problem tritt mit 0.5 nicht auf.

Weiß jemand wie mein Programm da auf so eine Kommazahl kommt?

— geändert am 23.02.2014, 10:30:31

Antworten
impjor
  • Forum-Beiträge: 1.793

23.02.2014, 11:01:21 via App

Du weist schon, dass Math.pow(1,1)*50 immer 50 ergibt?

Zu deinem Problem: 0,3 kann man nicht binär darstellen, deshalb ist das Ergebnis nicht ganz genau.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Evoh
  • Forum-Beiträge: 29

23.02.2014, 11:04:35 via Website

ja weiß ich ;) ich hab nur versucht, dass Problem herauszufinden deswegen hab ich die Variable die da noch drin war erstmal herausgenommen.

Hmm und wie kann ich das lösen, dass der Wert immer um 0.1 erhöht wird oder ist das prinzipiell nicht möglich?

Antworten
impjor
  • Forum-Beiträge: 1.793

23.02.2014, 13:50:18 via Website

Ich verstehe jetzt nicht genau, was du machen möchtest; aber du könntest einfach int-Werte nehmen und statt "+ 0.1" einfach "+1" rechnen und nur für die Ausgabe das Ergebnis durch 10 teilen.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

23.02.2014, 13:52:31 via Website

Du könntest auch einfach statt double-Typen von Variablen float nehmen, dann hättest du nicht so viele stellen

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Evoh
  • Forum-Beiträge: 29

23.02.2014, 14:01:53 via Website

Hm... funktioniert leider auch nicht...

Also ich will jede Sekunde Gesamt um 0.1 erhöhen. Nur wenn ich schon im 1. Schritt 1/10 teilen würde besteht das Problem ja immer noch.

Ich habe mir auch schon überlegt, dass Math.round ja auch funktionieren könnte nur das geht auch nicht -.- gibt es nicht eine Möglichkeit nur 1 Kommastelle zuzulassen? bzw. das nicht 0.100000000000000000000094 da steht sondern nur 0.1?

Antworten
impjor
  • Forum-Beiträge: 1.793

23.02.2014, 14:04:28 via Website

Natürlich. Du kannst Math.round() dafür benutzen. Willst du eine Nachkommastelle:
Math.round(x * 10) / 10d;

LG

— geändert am 23.02.2014, 14:36:03

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

23.02.2014, 14:06:10 via Website

Da du, wie ich sehe die Zahl in eine TextView schreibst, kannst du den String nach der ersten stelle auch einfach abschneiden.
Math#round Methode ist aber besser

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Evoh
  • Forum-Beiträge: 29

23.02.2014, 14:23:46 via Website

hmm ist weiß nicht, ob ich was falsch mache ;), aber bei mir funktioniert es nicht.

Also:
1double test;
2 test = Math.round(0.1*10) / 10;
3 System.out.println(test);
Da kommt 0.0 raus

und

1double test;
2 test = Math.round(0.1*10) ;
3 System.out.println(test);
So kommt 1 raus? wieso nicht auch 0.1 wenn ich das dann durch 10 rechen >.<

So langsam hasse ich die 0.1 :D und naja die anderen Zahlen im String abschneiden ist das nicht ziemlich unsauber?

Antworten
impjor
  • Forum-Beiträge: 1.793

23.02.2014, 14:35:53 via Website

Evoh
hmm ist weiß nicht, ob ich was falsch mache ;), aber bei mir funktioniert es nicht.

Also:
1double test;
2 test = Math.round(0.1*10) / 10;
3 System.out.println(test);
Da kommt 0.0 raus

Du musst durch 10d teilen, damit der Compiler weiß, dass du einen double-Wert erwartest. Sonst wird Java sagen 1 / 10 ist 0,1; auf int gecastet 0. int 0 auf double gecastet 0.0.

LH

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Evoh
  • Forum-Beiträge: 29

23.02.2014, 15:15:29 via Website

Hmmm hilft auch nicht...

1zaehler1 = zaehler1 + Math.round(0.1*10)/10d;

Antworten
Evoh
  • Forum-Beiträge: 29

23.02.2014, 15:40:32 via Website

impjor
Warum nicht? Mein Java-Compiler spuckt da 0.1 aus....

LG

meiner auch nur im Endeffekt in der App steht da wieder eine mit mehr Stellen nach dem Komma

aber diesmal nur alle 2x also bei 0.2 dann bei 0.4

— geändert am 23.02.2014, 15:43:49

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

23.02.2014, 15:47:20 via Website

Wie sieht denn dein Code jetzt aus?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
impjor
  • Forum-Beiträge: 1.793

23.02.2014, 16:00:08 via Website

Du hast zwei Möglichkeiten: Entweder du rundest am Ende den gesamten Wert auf ein/zwei Nachkommastellen, oder du rechnest mit int-Werten und teilst am Ende diese durch (z.B.) 10 und rundest dieses Ergebnis dann.
LG

— geändert am 23.02.2014, 16:02:41

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Evoh
  • Forum-Beiträge: 29

23.02.2014, 16:11:36 via Website

Okay danke hatte noch an einer Stelle das 10d vergessen :rolleyes:

Jetzt läuft es^^

Antworten