Variablen in formatierter Ausgabe

erikafuchs

Mitglied
Hallo Leute,
ich bin absoluter Anfänger und habe schon eine schwierige Frage:
Ich möchte die Dezimalstellen einer Kommazahl mit einer Zufallszahl festlegen. Ich kenne jetzt "printf("|%.2",zahl)" und möchte die "2" durch eine Variable z ersetzen, die als Zufallszahl erzeugt wird.
Geht das?
Pit
 

VfL_Freak

Top Contributor
Moin,
IMHO nicht! Ich denke, dass das der Compiler zur Compilezeit wissen muss!
Aber erläuter mal, was Du da überhaupt vorhast. Klingt mit verlaub ein bisschen abstrus ;)
VG Klaus
 

erikafuchs

Mitglied
Also denn:
Ich habe für meine Schüler ein Programm geschrieben, mit dem man nahezu alle Gebiete der Mathematik bis Klasse 10 üben kann. (wen es interessiert). Die Aufgaben werden alle mit Zufallszahlen erzeugt. Das ganze ist ein wirklich riesiges Makro in OpenOffice Calc. Meine Schüler wollen das als App, jetzt bin ich in Pension und habe das entsprechende Projekt hiermit gestartet.
Was die Schüler, aus welchen Gründen auch immer, nicht können, ist Runden. Also brauche ich zufällig erzeugte Dezimalzahlen die auf Hunderter, Zehner, Ganze, Zehntel, Hunderstel ... gerundet werden müssen.
Falls das nicht wie gewünscht geht, muss ich halt mehrere Zeilen mit select (?) schreiben.
 

fhoffmann

Top Contributor
So etwas vielleicht:
Java:
public class Test {
    public static void main(String[] args) {
        int anzahlStellen = 7; // Zufallszahl
        int zahl = 123;
        String format = "%0" + anzahlStellen + "d\n";
        System.out.printf(format, zahl);
    }
}
 

erikafuchs

Mitglied
Prima, danke!
So geht es auch mit Kommazahlen:
Code:
public class runden3 {
    
    public static void main(String[] args) {
        double zufall = Math.random()*5;
        int anzahlStellen = (int) zufall; // Zufallszahl
        System.out.println(anzahlStellen);
        double zahl = 123.456789;
        String format = "%." + anzahlStellen + "f";
        System.out.printf(format, zahl);
    }
}
 

mihe7

Top Contributor
So geht es auch mit Kommazahlen:
Zwei Dinge:

1. double sind binäre Fließkommazahlen, da gelten eigene Regeln:

Java:
public class Test {
    public static void main(String[] args) {
        vergleiche(0.3, 0.3);
        double zahl = 0.1 * 3;
        vergleiche(zahl, 0.3);
     }

     static void vergleiche(double d1, double d2) {
        if (d1 == d2) {
            System.out.printf("%f ist gleich %f\n", d1, d2);
        } else {
            System.out.printf("%f ist nicht gleich %f\n", d1, d2);
        }
     }
}

2. Die Ausgabe mit %f rundet auf 6 Stellen, wenn keine Stellenzahl angegeben wird.
 

erikafuchs

Mitglied
Das Genauigkeitsproblem von Fließkommazahlen ist mir schon (wenigstens wage) bewußt - welche Möglichkeit gibt es denn sonst? Festkommazahlen gibt es ja eher nicht.
 

mihe7

Top Contributor
Beim Runden besteht das Problem ja nur in der Ausgabe der nicht gerundeten Zahl (wenn diese bereits durch die Ausgabe gerundet wird, führt das Runden einer gerundeten Zahl ggf. zu einem anderen Ergebnis).

Mir ging es um die allgemeine Problematik der Genauigkeit, die in vielen Fällen zwar nicht gegeben ist, aber gerade bei Vergleichen eine Rolle spielt und ggf. Rechentrainern vermutlich nicht unberücksichtigt werden darf.

Für Bruchrechnungen eignen sich z. B. eigens hierfür geschriebene Klassen, die tatsächlich einen Bruch mit Zähler und Nenner darstellen.

Festkommazahlen gibt es ja eher nicht.
Festkomma: https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html
 
X

Xyz1

Gast
Java:
import java.math.BigDecimal;
import java.util.Random;

public class Runden {
	String runde() {
		return runde(new Random().nextDouble());
	}

	String runde(double d) {
		return runde(d, new Random().nextInt(10));
	}

	String runde(double d, int stellen) {
		BigDecimal d2 = BigDecimal.valueOf(d);
		d2 = d2.setScale(stellen, BigDecimal.ROUND_HALF_UP);
		return d2.toString();
	}

	public static void main(String[] args) {
		for (int i = 0; i < 5; i++) {
			System.out.println(new Runden().runde());
		}
	}
}
 
X

Xyz1

Gast
Mir war gerad langweilig:
Java:
import java.math.BigDecimal;

public class B {
	long z, n;

	/*
	 * ?
	 */
	B(double d) {
		BigDecimal d2 = BigDecimal.valueOf(d);
		int s = d2.scale();
		z = d2.movePointRight(s).longValue();
		n = BigDecimal.ONE.movePointRight(s).longValue();
	}

	/*
	 * (z/n) must be lower than one.
	 */
	B(long z, long n) {
		this.z = z;
		this.n = n;
	}

	B add(B b) {
		long c = Math.abs(n), d = Math.abs(b.n);
		while (c > 0 && d > 0) {
			if (c > d)
				c = c % d;
			else
				d = d % c;
		}
		long ggt = c + d;

		if (n < b.n) {
			return new B(z * ggt + b.z, b.n);
		} else {
			return new B(z + b.z * ggt, n);
		}
	}

	B su(B b) {
		long c = Math.abs(n), d = Math.abs(b.n);
		while (c > 0 && d > 0) {
			if (c > d)
				c = c % d;
			else
				d = d % c;
		}
		long ggt = c + d;

		if (n < b.n) {
			return new B(z * ggt - b.z, b.n);
		} else {
			return new B(z - b.z * ggt, n);
		}
	}

	B mul(B b) {
		return new B(z * b.z, n * b.n);
	}

	B div(B b) {
		long c = Math.abs(n), d = Math.abs(b.n);
		while (c > 0 && d > 0) {
			if (c > d)
				c = c % d;
			else
				d = d % c;
		}
		long ggt = c + d;

		if (n < b.n) {
			return new B(z * ggt * b.z, b.n);
		} else {
			return new B(z * b.z * ggt, n);
		}
	}

	@Override
	public String toString() {
		BigDecimal d2 = BigDecimal.valueOf(z);
		d2 = d2.divide(BigDecimal.valueOf(n));
		d2 = d2.setScale(5, BigDecimal.ROUND_HALF_UP);
		return d2.toString();
	}

	public static void main(String[] args) {
		System.out.println(new B(1, 2).add(new B(1, 4)).su(new B(1, 2)).mul(new B(1, 8)).div(new B(1, 16)));
	}
}


Allerdings müssen die Brüche alle kleiner 1 sein. :(
Und der "geklaute" Konstruktor (B(double d) {) stimmt noch nich.
 

mihe7

Top Contributor
Auf Deutsch:

Java:
class Bruch {
    int zaehler;
    int nenner;

    public Bruch(int zaehler, int nenner) {
        if (nenner == 0) {
            throw new ArithmeticException("Nenner darf nicht 0 sein");
        }
        this.zaehler = nenner < 0 ? -zaehler : zaehler;
        this.nenner = nenner < 0 ? -nenner : nenner;
        kuerzen();
    }

    public Bruch negiert() {
        return new Bruch(-zaehler, nenner);
    }

    public Bruch kehrwert() {
        return new Bruch(nenner, zaehler);
    }

    public Bruch addiere(Bruch b) {
        return new Bruch(zaehler * b.nenner + nenner * b.zaehler,
                         nenner * b.nenner);
    }

    public Bruch subtrahiere(Bruch b) {
        return addiere(b.negiert());
    }

    public Bruch multipliziere(Bruch b) {
        return new Bruch(zaehler * b.zaehler, nenner * b.nenner);
    }

    public Bruch dividiere(Bruch b) {
        return multipliziere(b.kehrwert());
    }

    private void kuerzen() {
        int ggt = Bruch.ggT(zaehler, nenner);
        zaehler /= ggt;
        nenner /= ggt;
    }
        
    public static int ggT(int a, int b) {
        a = Math.abs(a);
        b = Math.abs(b);

        while (b != 0) {
            int h = a % b;
            a = b;
            b = h;
        }
        return a;
    } 

    @Override
    public boolean equals(Object o) {
        if (o == null || o == this || !(o instanceof Bruch)) {
            return o == this;
        }

        Bruch b = (Bruch) o;
        return zaehler == b.zaehler && nenner == b.nenner;
    }

    @Override
    public int hashCode() {
        return 5*zaehler + 13*nenner;
    }

    @Override
    public String toString() {
        return "(" + zaehler + "/" + nenner + ")";
    }

    public static void main(String[] args) {
        System.out.println(new Bruch(1, 2)
                .addiere(new Bruch(1, 4))
                .subtrahiere(new Bruch(1, 2))
                .multipliziere(new Bruch(1, 8))
                .dividiere(new Bruch(1, 16)));
    }
}
 
X

Xyz1

Gast
mihe7, Das funktioniert immer noch nich...
Java:
	/*
	 *
	 */
	B(long z, long n) {
		this.z = n < 0 ? -z : z;
		this.n = n < 0 ? -n : n;
	}


Sobald (z/n) größer-gleich 1 ist, zum Beispiel bei new B(2, 1), dann kommt da etwas ganz Merkwürdiges raus....
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Welcher Object-Lock-Pool bei static Variablen? Java Basics - Anfänger-Themen 3
T variablen klassen übergreifend Java Basics - Anfänger-Themen 12
T Variablen Java Basics - Anfänger-Themen 1
N Verständnis Frage zu Variablen Java Basics - Anfänger-Themen 3
M Aufsummieren von variablen Wertegrößen Java Basics - Anfänger-Themen 17
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
J Speichern von zwei Variablen durch Auslesen aus einem Numberfield Java Basics - Anfänger-Themen 2
ashi Variablen aufrufen Java Basics - Anfänger-Themen 17
U Warum kann ich, auf private Variablen zugreifen, wenn ich ein Objekt in der Klasse, die private Variablen hat erstelle und dort drauf zugreifen will? Java Basics - Anfänger-Themen 7
B Konkatenieren eines Strings und inkremtierenden Zahl zu einer INT Variablen Java Basics - Anfänger-Themen 7
A 2 Strings vergleichen in einer methode wenn man mit Globalen variablen arbeitet Java Basics - Anfänger-Themen 12
C Konstruktoren und Variablen Java Basics - Anfänger-Themen 42
F Auf Variablen eines Konstruktors zugreifen Java Basics - Anfänger-Themen 4
N Variable aus anderen Variablen in statischer Klasse berechnen/abspeichern? Java Basics - Anfänger-Themen 4
M Wie kann ich bei int-Variablen im exception handler auf bestimmte Strings reagieren? Java Basics - Anfänger-Themen 5
M Warum dürfen Objekte einer Klasse auf statische Variablen dieser Klasse referenzieren? Java Basics - Anfänger-Themen 10
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
T Java Swing - Dreieck zeichnen mit verschiedenen Variablen Java Basics - Anfänger-Themen 8
Arif Vererbung Methodenvererbung mit finalen Variablen Java Basics - Anfänger-Themen 1
M Wie kann ich ein Objekt erstellen, wenn sich der Klassenname in einer Variablen befindet? Java Basics - Anfänger-Themen 10
S Variablen Variablen in einer Schleife erstellen lassen Java Basics - Anfänger-Themen 11
J Ich brauche Hilfe bei einem Code (Variablen speichern) Java Basics - Anfänger-Themen 29
F Variablen Werte einer Klasse überschreiben Java Basics - Anfänger-Themen 4
N Speichern von Werten in Variablen nach Schließen des Programms Java Basics - Anfänger-Themen 3
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
M Java Instanz-Variablen ? Java Basics - Anfänger-Themen 3
B Variablen von Methoden übertragen Java Basics - Anfänger-Themen 2
M Variablen umbenennen Java Basics - Anfänger-Themen 1
T Körper Brechnung - Lokale Variablen in Methoden übergeben Java Basics - Anfänger-Themen 10
P Zugriff auf Variablen anderer Klassen in Greenfoot Java Basics - Anfänger-Themen 1
mars90 Fehler in der Variablen Deklaration Java Basics - Anfänger-Themen 8
V Schleife für das Einlesen von Werten für int Variablen, die Bestandteil von Arrays sein sollen Java Basics - Anfänger-Themen 16
M Komisches Verhalten der Variablen Java Basics - Anfänger-Themen 6
H Variablen Multiplikation einer inkrementierten Variablen Java Basics - Anfänger-Themen 5
scratchy1 Variablen vertauschen wenn Bedingung "umgedreht" wird Java Basics - Anfänger-Themen 40
J Variablen mit einer anderen Klasse bekannt machen Java Basics - Anfänger-Themen 7
C Methoden Problem beim Speichern von Variablen Java Basics - Anfänger-Themen 1
A Übergreifende Variablen Java Basics - Anfänger-Themen 17
A Variablen Verständnisfrage bzgl. Variablen/Referenzen Java Basics - Anfänger-Themen 3
H Variablen Methode zum Abfragen von Variablen aus Subklassen Java Basics - Anfänger-Themen 9
P Variablen Variablen voneinander abhängig Java Basics - Anfänger-Themen 54
F Liste nach einer Variablen sortieren Java Basics - Anfänger-Themen 6
L Variablen in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
M For-Schleife durch zwei versch. Variablen begrenzen Java Basics - Anfänger-Themen 27
J Klassen Variablen in andere Klassen oder Methoden übernehmen Java Basics - Anfänger-Themen 1
P Liste auslesen und in Variablen speichern Java Basics - Anfänger-Themen 7
temi Redundante Variablen Java Basics - Anfänger-Themen 29
Aprendiendo Zweifel mit versteckter Variablen Java Basics - Anfänger-Themen 16
L Variablen einmal nur zu weisen Java Basics - Anfänger-Themen 62
D Statische Variablen/Methoden Java Basics - Anfänger-Themen 3
R Abfrage von Variablen in Unterklassen einer ArrayList Java Basics - Anfänger-Themen 9
M Listener für Button - Wert von Variablen verändern Java Basics - Anfänger-Themen 14
S Vererbung Variablen klassenübergreifend nutzen Java Basics - Anfänger-Themen 42
R Auf Variablen einer anderen Klasse zugreifen? Java Basics - Anfänger-Themen 1
D Fehlermeldung obwohl Variablen bereits deklariert sind? Java Basics - Anfänger-Themen 14
E 2 Probleme - Datum & private finale Variablen Java Basics - Anfänger-Themen 5
Aruetiise Variablen JFrame und Variablen Java Basics - Anfänger-Themen 3
L Variablen dekleration + reset Java Basics - Anfänger-Themen 16
T Übernahme einer Variablen im ActionListener/ActionEvent Java Basics - Anfänger-Themen 2
D Kapselung final Variablen mit Getter? Java Basics - Anfänger-Themen 2
C Variablen von einem JFrame in einen anderen übertragen Java Basics - Anfänger-Themen 3
P Interface Variablen-Inhalte werden nicht übergeben Java Basics - Anfänger-Themen 3
C Variablen in Schleifen außerhalb verwenden Java Basics - Anfänger-Themen 2
S Variablen Flexible Variablen Namen Java Basics - Anfänger-Themen 3
R Erste Schritte 3 Variablen hochzählen lassen Java Basics - Anfänger-Themen 1
RowdyN Variablen Variablen beliebig benennen? Java Basics - Anfänger-Themen 6
S OOP Variablen zwischen mehreren Klassen Java Basics - Anfänger-Themen 11
T Koordinatensystem zeichnen - Variablen merken? Quadratische Funktion zeichnen? Java Basics - Anfänger-Themen 5
H Variablen einer Schleife zwischenspeichern Java Basics - Anfänger-Themen 2
P Klassen Variablen von einer Klasse zur anderen Java Basics - Anfänger-Themen 5
H Objekt überschreibt Variablen vorheriger Objekte Java Basics - Anfänger-Themen 2
P Variablen in Excel speichern Java Basics - Anfänger-Themen 6
S PHP Aufruf mit mehreren Variablen Java Basics - Anfänger-Themen 2
F Variablen unterschiedlicher Datentypen Java Basics - Anfänger-Themen 6
S ActionListener und Statische Variablen Java Basics - Anfänger-Themen 4
Arif Vererbung Vererbung Variablen überschreiben Java Basics - Anfänger-Themen 1
L Vergleich zweier Variablen, mit Abweichung Java Basics - Anfänger-Themen 3
P Variablen einer Methode in andere Method übergeben Java Basics - Anfänger-Themen 6
G Variablen Verwendung von Variablen in anderer Klasse Java Basics - Anfänger-Themen 6
P Textfelder in Variablen speichern Java Basics - Anfänger-Themen 13
K arraygröße durch variablen Konstruktor? Java Basics - Anfänger-Themen 7
J Vererbung Variablen aus Superklasse übernehmen Java Basics - Anfänger-Themen 2
L Variablen aus TXT Datei auslesen und vergleichen. Java Basics - Anfänger-Themen 5
K Welchen Typ haben Variablen in Default-Methoden und in statischen Methoden in Schnittstellen? Java Basics - Anfänger-Themen 4
K Wieso muss man finale statische Variablen sofort oder eben im Konstruktor initialisieren? Java Basics - Anfänger-Themen 2
L zwei Variablen gleichzeitig übergeben Java Basics - Anfänger-Themen 6
J Vererbung privater Variablen Java Basics - Anfänger-Themen 7
D Klassen Verhalten von Klassenvererbung bei Variablen Java Basics - Anfänger-Themen 1
G Alle Objekte und Variablen automatisch ausgeben Java Basics - Anfänger-Themen 7
S OOP Werte von Vektoren mit 3 Variablen ausgeben lassen Java Basics - Anfänger-Themen 3
A Variablen aus einer Schleife gezielt auslesen Java Basics - Anfänger-Themen 11
A Methoden Zugriff auf eingelesene Variablen in der main Methode (ohne Änderung der Parameterliste) Java Basics - Anfänger-Themen 4
K Enigma, variablen übernehmen Java Basics - Anfänger-Themen 6
F Erste Schritte Dynamische Variablen Java Basics - Anfänger-Themen 15
N Variablen zurück casten Java Basics - Anfänger-Themen 3
M Repräsentation von variablen/OOP Java Basics - Anfänger-Themen 2
B Probleme beim einlesen einer short variablen für einen Array Java Basics - Anfänger-Themen 1
S Warum erlaubt ein while-Loop keine Variablen-Declaration wie der for-Loop..? Java Basics - Anfänger-Themen 6
S Variablen Variable erzeugen und Array mit Variablen befüllen Java Basics - Anfänger-Themen 26

Ähnliche Java Themen

Neue Themen


Oben