Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
1. Modulo mit 1
2. Schleife mit int i = Anzahl Schleifendurchläufe
3. int wert anlegen mit Wert Math.pow(10, i) * floatWert
4. testen, ob wert == floatWert ist, wenn ja, dann Schleife abbrechen/beenden
Anzahl Nachkommastellen = i
Oder zu einem String machen und nach dem Komma splitten.
Musst nur aufpassen, dass der Wert nicht sowas wie 3.2E-20 ist. Also da vllt mit dem NumberFormat umwandeln und nicht einfach toString.
1. Modulo mit 1
2. Schleife mit int i = Anzahl Schleifendurchläufe
3. int wert anlegen mit Wert Math.pow(10, i) * floatWert
4. testen, ob wert == floatWert ist, wenn ja, dann Schleife abbrechen/beenden
Anzahl Nachkommastellen = i
Das geht schief, sobald es mehr als ~10 Nachkommastellen werden, da du dann an die Grenze von 2^31-1 stößt.
Und doubles können seehr viele Nachkommastellen haben.
Ich denke es ist sinnvoller, das über einen String zu lösen:
Java:
public int stellen(double d) {
String s = Double.toString(d);
s = s.substring(s.indexOf(",") + 1);
return s.length();
}
Oder zu einem String machen und nach dem Komma splitten.
Musst nur aufpassen, dass der Wert nicht sowas wie 3.2E-20 ist. Also da vllt mit dem NumberFormat umwandeln und nicht einfach toString.
Erstmal danke, dass so schnell so viele Antworten kamen.
Also übernehme ich den Quelltext von kirax und ersetze toString durch was?
(Das Programm, zu dem das gehört, rechnet mit einiger Genauigkeit, daher kann es auch sein, dass hinten e-* steht)
Was du auch noch checken müsstest ist der decimal separator. Im Deutschen ist das ein Komma, im Englischen schon ein Punkt.
Hab das noch nie gemacht, aber da gibts auch irgendwie ne Möglichkeit auf unterschiedliche locals zu reagieren.
Wie genau brauchst du denn die Nachkommastellen? Und: Wie viele Nachkommastellen hat 1.0/3.0? Wenn es um Genauigkeit geht, sollte wohl eher BigDecimal herhalten (oder man zählt die signifikanten Stellen selbst mit).
Das Problem hat man mit allen periodischen Zahlen.
Und Fließkommazahlen unterliegen sowieso einer Ungenauigkeit, die wahrscheinlich eh höher ist als die Toleranz um die es bei dem Problem geht
Was du auch noch checken müsstest ist der decimal separator. Im Deutschen ist das ein Komma, im Englischen schon ein Punkt.
Hab das noch nie gemacht, aber da gibts auch irgendwie ne Möglichkeit auf unterschiedliche locals zu reagieren.
Das Problem hat man mit allen periodischen Zahlen.
Und Fließkommazahlen unterliegen sowieso einer Ungenauigkeit, die wahrscheinlich eh höher ist als die Toleranz um die es bei dem Problem geht
Naja, es gibt mehrere Möglichkeiten, den Datentyp anzulegen, den ich aus dem float/double ziehen will: einmal über 2 Zahlen, die danach von der Funktion Dividiert werden [abc(5, 3) => 1u2/3] oder über ein float/double, was halt etwas ungenau ist, wenn man etwas genauer rechnen will, nimmt man halt die andere Möglichkeit...
/*
* Constructs a Fraction out of a double.
* Example: 0.333 -> 333/1000
*/
public Fraction(double zahl) {
for (int i = 1; true; i *= 10) {
if ((double)(zahl*i) == Math.floor(zahl*i)) {
this.numerator = (int)(zahl*i);
this.denominator = i;
break;
}
}
}
ich glaub du meinst ohne d, ich teste das mal, moment...
Edit: Gerade getestet, => 0 aber für solche Fälle hab ich:
Java:
/*
* Constructs a Fraction with an long numerator and an long denominator.
* TODO: For constructing a Random Fraction use Fraction().
*/
public Fraction(long numerator, long denominator) {
this.numerator = numerator;
if (denominator == 0) {
throw (new ArithmeticException("Denominator can't be 0."));
}
this.denominator = denominator;
}