rundungsfehler ?

Status
Nicht offen für weitere Antworten.

5etH

Aktives Mitglied
ich hab folgen QT angelegt, aber er rundet mir nicht richtig. kann mir jemand verraten warum und was ich machen muss damit es geht ?

Code:
 import Prog1Tools.IOTools;
public class dreck  {

  public static void main(String[] args) {
    double von, bis, zeit, ergebnis;
    von = IOTools.readDouble("angefangen: ");
    bis = IOTools.readDouble("schluss gemacht; ");
    zeit = (bis - von);
    ergebnis = 100 *  Math.round(zeit/100);
    System.out.println(ergebnis);
  }
}
 
S

SlaterB

Gast
> ergebnis = 100 * Math.round(zeit/100);
> System.out.println(ergebnis);

Schrott

schreibe

ergebnis = zeit;
System.out.println(ergebnis);
ergebnis = ergebnis/100.0;
System.out.println(ergebnis);
ergebnis = Math.round(ergebnis;
System.out.println(ergebnis);
ergebnis = 100.0 * ergebnis;
System.out.println(ergebnis);

so, welche 4 Werte gekommst du nun
und was möchtest du eigentlich stattdessen als Endergebnis haben/ an welcher Stelle soll gerundet werden?
vielleicht kommst du ja so selber drauf
 
S

SlaterB

Gast
selber denken nicht nötig, was?

wenn du eine Zahl 0.345 hast
was wäre dann wohl besser, durch 100 zu teilen und 0.00345 zu runden
oder mit 100 zu multiplizieren und 34.5 zu runden?

na ich geb auf..
 

5etH

Aktives Mitglied
1. wäre es besser wenn du nicht beleidigent wirst 2. frage erst was ich damit vor habe bevor du es nieder machst und 3. ich kann selber denken sonst würde ich ja wohl net erst was schreiben und dann ins forum gehen .... also ich bitte nun um konstruktive hilfen schliesslich ist das der anfänger bereich
 

5etH

Aktives Mitglied
also ich gebe werte ein die nicht mehr als 2 nachkomma stellen haben aber ausgeben tut er mir das ergebnis mit 8 nachkommastellen
 
S

SlaterB

Gast
noch verwunderlicher, wie es dazu kommt kann ich nun gar nicht mehr nachvollziehen,
umso mehr solltest du die ganzen Zwischenschritte benutzen, wie ich geschrieben habe
 

5etH

Aktives Mitglied
so ich hab jez mit modulus gearbeitet also des runden is immernoch net so aber naja ... was mich jez im mom mehr interessiert ob es möglich ist eine zahl 9.6 so darzustellen das nur die 9 da steht. wäre nett
wenn ihr für beides ne lösung findet :)


@ deathbyaclown was du meinst geht leider nicht warum auch immer

***edit

habe das mit den "runter" runden selbstgelöst wäre jez echt nett wenn ihr mir mit dem runden helfen könnt weil dann wäre des grog soweit fertig im kern und ich könnte es dann in en applet intigrieren
 

FenchelT

Bekanntes Mitglied
5etH hat gesagt.:
so ich hab jez mit modulus gearbeitet also des runden is immernoch net so aber naja ... was mich jez im mom mehr interessiert ob es möglich ist eine zahl 9.6 so darzustellen das nur die 9 da steht. wäre nett
wenn ihr für beides ne lösung findet :)


@ deathbyaclown was du meinst geht leider nicht warum auch immer

***edit

habe das mit den "runter" runden selbstgelöst wäre jez echt nett wenn ihr mir mit dem runden helfen könnt weil dann wäre des grog soweit fertig im kern und ich könnte es dann in en applet intigrieren


Hallo,

vllt. hilft Dir dieses Beispiel ja fuer Dein "9er" Problem:


Code:
double n = 9.6;
		int x = 0;
		
		
		n = Math.floor(n);
		x = (int) n;
		
		System.out.println(n);
		System.out.println(x);
 

jPat

Bekanntes Mitglied
1.:
Code:
int zahl = (int) 9.6;

runden:

Code:
double andereZahl = 12.344;
		int zahl = (int) (andereZahl*100+0.5);
		double gerundet = ((double)zahl)/100.0;
		System.out.println(gerundet);
 

5etH

Aktives Mitglied
okay vielen dank für eure anregungen ich werde mal sehen wie es läuft werde es jez mal einbauen hab an der arbeit eh nix zu tun xD
 

5etH

Aktives Mitglied
hmm hat auch nichts gebracht ich poste mal wie weit das programm ist und vill könnt ihr es ja direkt einbauen

Code:
import Prog1Tools.IOTools;
public class arbeitsrechner {

  public static void main(String[] args) {

    double von, bis, min, min2, std;

           von = IOTools.readDouble("angefangen: ");

    System.out.println("-------------------------------------------------------------");

                    bis = IOTools.readDouble("schluss gemacht; ");

                    min = (((int)von % bis) - von % bis );

           min2 =(min * 0.6);

           std = ((bis - von) - min);

    System.out.println("-------------------------------------------------------------");



           System.out.println(min2 + " min und " + std + " std gearbeitet ");
           
            // min2 und std soll gerundet werden 
            // std auf ganze zahlen 
            // min 2 auf 2 nachkommer stellen 

         System.out.printlm("#############################################################");
  }
}


also ich hoffe es bringt euch was, und bitte nicht meckern wie er geschrieben ist. ich werkle erst seid ner woche mit java

also ich bin für alles konstruktive offen

und schonmal vielen dank im vorraus
 
S

SlaterB

Gast
sinnvoll wäre, dazu auch eine Frage zu stellen,
oder soll man die sich weiter oben zusammensuchen..

und am besten auch noch konkret sagen was los ist:
ich gebe ein: x
das Programm macht daraus: y
gewünscht ist aber: z
 

5etH

Aktives Mitglied
guck bei den comments im programm selber da steht drin was ich haben will

aber nochmal für alle es ist zum ausrechnen von arbeitszeiten gedacht weil wir hier im betrieb die 60 minuten in hunderstel getrennt sind und ich immer zu faul bin zum rechnen weil das hier gleitzeit ist und ich ja auf meine zeit kommen will aber lange rede kurzer sinn

in den kommentaren steht was noch nicht geht (im programm selber)

hier ein paar testdaten

angefangen: 7.35
aufgehört 17.10
std müsste 10 sein und min 21
 
S

SlaterB

Gast
// std auf ganze zahlen

Math.round(std);

// min 2 auf 2 nachkommer stellen

Math.round(min2 * 100.0) / 100.0;
 

5etH

Aktives Mitglied
okay vielen dank habs eingebaut und scheint bis jez zu funzen ich mach noc en paar testläufe aber schonmal vielen dank habt mir echt geholfen

aber euch ist bestimmt aufgefallen das die min negativ sind wisst ihr warum ich komm nicht drauf liegt es an dem part mit dem modulu ?
 
S

SlaterB

Gast
da kein Mensch IOTools kennt oder benutzt kann niemand etwas mit deinem Code anfangen,
daher fällt auch nichts auf

wenn du irgendwelche Probleme mit der Zeile
min = (((int)von % bis) - von % bis );
hast, dann weißt du ja, was zu tun ist:

eine konkrete Frage stellen (nein, 'xy geht nicht' zählt nicht), erklären was passieren soll + Beispiel:
ich gebe ein: x
das Programm macht daraus: y
gewünscht ist aber: z
 

5etH

Aktives Mitglied
hab nun leider folgendes problem. unzwar dreht es sich darum das bei den testdaten
anfang 7
ende 18.75

er mir keine minuten angiebt
 
S

SlaterB

Gast
was um alles in Welt heißt denn das?
was soll man denn dazu sagen?

dein Programm enthält doch z.B. auch
System.out.println("-------------------------------------------------------------");
klappt das auch nicht mehr?
sage doch immer ganz genau was passiert..

wann immer du nicht weißt, was dein Programm macht,
musst du zu
Code:
public class Test {
  public static void main(String[] args) {
       System.out.println("Hello World");
  } 

}
zurückkehren und dann nach und nach die unbekannten Dinge einfügen,

im Fehlerfall einfacher: nur die letzten Änderungen wieder rausnehmen
 

5etH

Aktives Mitglied
also ich hab das ganze programm jez kommentiert und hoffe das ihr jez mehr damit anfangen könnt




Code:
   import Prog1Tools.IOTools;
public class arbeitsrechner {

  public static void main(String[] args) {

    double von, bis, min, min2, std;
    //initialisieren von 5 doubles 

           von = IOTools.readDouble("angefangen: ");

            //einlesen eines double wertes 
  

                    bis = IOTools.readDouble("schluss gemacht; ");
                    //einlesen eines 2. doubles wertes 
                    
                    min = (((int)von % bis) - von % bis );
                    // isolieren der  minuten          
             min2 =(min * 0.6);
            //hunderstel minuten in sechzigstel umwandeln

           std = ((bis - von) - min);
            //isolieren der stunden

           min2 = Math.round(min2 * 100.0)/100.0;

            //runden der sechzigstel minuten            

           std = (int)std;

            //runden der stunde (wird immer abgerundet)
           
            min2 = min2 * -1;
            //abfangen das minuten im negativen bereich dargestellt werden

           System.out.println(min2 + " min und " + std + " std gearbeitet ");
            //ausgabe der gearbeiteten zeit 
           
  }
}


so also in diesem programm gebe ich an wann ich angefangen hab und wann ich mit meiner arbeit aufgehört hab und es funzt auch bis jetzt einigermaßen, aber sobald ein wert eingegen wird bei dem er die stunde aufrunden würde gibt er mir am ende keine minuten aus. also ich bin diesbezüglich ratlos und weis jez auch nicht wo der fehler im programm liegt


wenn ihr noch fragen zum QT haben solltet dann bitte konkrete fragen die lassen sich einfacher beantworten

also nochmals danke im vorraus ihr konntet mir ja bis jetzt weiterhelfen und hoffe das ihr den letzten fehler noch findet
 
S

SlaterB

Gast
> aber sobald ein wert eingegen wird bei dem er die stunde aufrunden würde gibt er mir am ende keine minuten aus

was verstehst du unter 'nix ausgeben', ein schwarzer Bildschirm, Programmabbruch, oder wird einfach nur am Ende

0 min und 1 std gearbeitet

ausgegeben oder was genau passiert denn nun?
 

5etH

Aktives Mitglied
also er gibt mir dann aus zb das ich 0 min und 6 stunden gearbeitet habe das passiert aber nur wenn der wert für die minuten über 50 geht ansonsten geht es d.h. er rundet wohl irgentwo falsch aber wo finde ich nicht ... sitze heute schon den ganzen tag am arbeitsplatz und grüble woran das liegen kann
 
S

SlaterB

Gast
so, gut dass dieser wichtige Punkt erklärt ist,
erzähle bitte nicht so einfach das irgendwas nicht ausgegeben wird,
eine Ausgabe 0 ist sehr real,

und nun der beste Schritt in diesem Topic bisher: IOTools ab auf den Schrotthaufen!
du kannst doch die Werte auch direkt in der Quelltext schreiben, dann funktioniert es bei JEDEM anderen Programmierer auch ;)

Code:
public class arbeitsrechner
{

    public static void main(String[] args)
    {

        double von, bis, min, min2, std;

        von = 7;        // <------------- hier die Eingaben
        bis = 18.75;

        min = (((int)von % bis) - von % bis);
        min2 = (min * 0.6);

        std = ((bis - von) - min);

        min2 = Math.round(min2 * 100.0) / 100.0;


        std = (int)std;

        min2 = min2 * -1;

        System.out.println(min2 + " min und " + std + " std gearbeitet ");
        // ausgabe der gearbeiteten zeit

    }
}

Ausgabe:
-0.0 min und 11.0 std gearbeitet

womit wir wieder bei der Ursprungsfrage sind, was genau soll eigentlich passieren?
was ist das erwartete Endergebnis nach welcher Rechnung?

(ich werde das bewußt nicht selber lösen, sondern du sollst erzählen was passieren soll und dann können wir ja schauen, was stattdessen abläuft)
 

jPat

Bekanntes Mitglied
sollen deine eingaben Uhrzeiten darstellen??

also von 7 bis 18.5
ist 7:00 bis 18:30 ??

und deine Ausgabe (ist/soll) dann

30 min und 11 std gearbeitet sein??

dann ist die Formel:
18.5 - 7 = 11.5 <- deine Stunden mit Min ??
nun:
std = (int) 11.5
rest = 11.5 - std
min = 60 * 0.5

Code:
double von,bis,zeit,min ;
// eingabe ...
zeit = bis - von;
std = (int) zeit;
min =  (zeit - (double) std) * 60; 
System.out.println(min +" min " +std+"std");
 

5etH

Aktives Mitglied
also nochmal um das zu klären ich habe des programm versucht zu schreiben um mir das leben und das leben von ein paar kollegen zu erleichtern ... also es soll folgendes passieren sie geben ein wann sie angefangen haben also z.b. 6.30 uhr und wann sie gegangen sind wie z.b. 18.30 uhr . so da wir im betrieb mir einer stechuhr arbeiten sind die 60 min in hundertstel geteilt. das programm mach oder besser sollte die stunden die ja nicht umgerechnet werden müssen von den minuten trennen, die minuten dann mit 0,6 multiplizieren um wieder auf das normale maß von 60min = 1 std zu kommen und dann beides ausgeben also die reellen minuten und stunden. sprich wie lange sie gearbeitet haben


so ich hoffe das es jez genau genug beschrieben ist
 

jPat

Bekanntes Mitglied
Deine Anforderung solltest du auf diese art nicht lösen!!

Falls du Java benutzen möchtest, um dieses Problem zu lösen, benutze BITTE die OOP, d.h. Schau dir mal die API an und entsprechende Klassen, in denen du UHRZEITEN darstellen kannst.
 

5etH

Aktives Mitglied
naja das es mit exel geht is mir klar es war halt nur mal ne herrausvorderung aber die api hört sich ganz gut an dann hab ich morgen an der arbeit was zu tun :D also dann vielen dank und ich denke, das dass thema damit fertig ist nochmals vielen dank an alle
 
S

SlaterB

Gast
ok, das ist nun klar, und man kann wohl nicht mehr hoffen dass du das selber hinbekommst,

jPat hat schon eine Variante gepostet, wie ich gerade sehe,
ansonsten auch noch:

Code:
public class arbeitsrechner
{

    public static void main(String[] args)
    {

        double von, bis;
        int std;
        double min;

        von = 7;
        bis = 18.75;


        std = (int)(bis - von); // rundet automatisch ab
        min = (bis - von) - std; // < 1

        min *= 0.6; // min
        min = Math.round(min * 100.0) / 100.0; // runden


        System.out.println(min + " min und " + std + " std gearbeitet ");
        // ausgabe der gearbeiteten zeit

    }
}
(edit: die zweite Seite noch gar nicht gelesen ;) )
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben