float/double Anzahl Nachkommastellen ermitteln

  • Themenstarter Themenstarter Max Matti
  • Beginndatum Beginndatum
M

Max Matti

Gast
Hi,

Ich brauche gerade für mein Projekt eine Funktion, die die Anzahl der Nachkommastellen von einer Variable (float oder double) ermittelt, d.h.:

0,5 ->1
11,003 ->3
0,000 000 004 -> 9

Gibt es das in der Math-Klasse (alleine hab ichs nicht gefunden) oder muss ich das selber schreiben, wenn ja wie?

lg
Max
 
Musst du selber schreiben:
Code:
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.
 
Musst du selber schreiben:
Code:
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.
Da war wohl jemand schneller. Den Test auf die Darstellung muss man natürlich machen.
 
Hi,

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)

lg
Max
 
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).

Ark
 
Auch noch eine möglichkeit wäre:
Java:
float a = (float) 2.2789;
		
		String[] asplit =  Float.toString(a).split("\\.");
		int nachkomma = asplit[1].length();
		System.out.println(nachkomma);
 
Zuletzt bearbeitet:
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.

Java:
DecimalFormatSymbols.getInstance().getDecimalSeparator()
 
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...
 
Zuletzt bearbeitet von einem Moderator:
Hab es jetzt so gelöst:

Java:
	/*
	 * 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;
			}
		}
		
	}
 
Hi,

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;
	}

(und das gleiche noch mit ints)
 

Anhänge

Zuletzt bearbeitet von einem Moderator:

Zurück
Oben