runden ohne math! (zur not auch mit)

Status
Nicht offen für weitere Antworten.

dermoritz

Bekanntes Mitglied
es geht um folgende simple operation die ich gerne so modifizieren würde, dass die double-interne-darstellung-rundungsfehler kompensiert sind - auf deutsch: ich hätte gern das mathematisch korrekte ergebnis.

nun gibt es ja in java.math diverse rundungsfunktionen - geht es auch ohne diese, nur mit den grundrechenarten und rest usw.?

hier der code. was ich dort ausgebe brauche ich im richtigen programm als double aber eben nicht 0.7000..1 sondern 0.7. (wie in dem beispiel)

die 0.02 ist eine variabele, das ganze soll also für alle möglichen anderen faktoren funktionieren. (probiert mal 0.3 ;-))

Code:
for(int i=0;i<40;i++){
		  System.out.println(i*(double)0.02);
	  }


vielen dank im voraus.
 

xysawq

Bekanntes Mitglied
ganz steinzeitlich könnte man auch so runden:
Code:
double zahl = 12.345;
int temp;

//ohne Nachkommastellen:
temp = (int)(zahl + 0.5);
zahl = (double)temp;

//eine Nachkommastelle
temp = (int)((zahl * 10) + 0.5);
zahl = (double)(temp/10.);

//usw...

Das '+ 0.5' ist einfach erklärt, ab .5 wird aufgerundet, hat man also z.b. 12.345 erhält man 12.845, durch den Cast nach int werden die Kommastellen einfach abgeschnitten.
Hat man aber 12.5 (minimale Nachkommazahl zum Aufrunden) und addiert .5 erhält man 13.0...
 

Marco13

Top Contributor
Es ist nicht möglich. Bestimmte Zahlen (wie z.B. schon 0.1) können als double einfach nicht genau dargestellt werden. (Punkt. Daran gibt es nichts zu rütteln und zu runden). Dass es (z.B. auf der Konsole) trotzdem als 0.1 ausgegeben wird, ist vielmehr eine "kline Nettigkeit" der Methode, die eine double-Zahl in einen String umwandelt.
 

Baunty

Mitglied
EDIT : Die Antwoten wurden bei mir nicht dargestellt die "Lösung" steht schon oben

Warum nicht Math.round ?

Du kannst die Funktionsweise von Math.round natürlich auch selbst schreiben, ich verstehe nur nicht was dir das bringt.

Code:
double erg, faktor = 0.3; // Nur als Beispiel
        
        
        for(int i=0; i<40; i++) {
            erg = i * faktor;
            if(erg-(long)erg > 0.5) {
                erg = (long)erg +1;
            }
            else {
                erg = (long)erg;
            }
            System.out.println(erg);
        }
 
S

SlaterB

Gast
Marco13 hat gesagt.:
Dass es (z.B. auf der Konsole) trotzdem als 0.1 ausgegeben wird, ist vielmehr eine "kline Nettigkeit" der Methode, die eine double-Zahl in einen String umwandelt.

ich glaube, gegen diese feine Unterscheidung hat der Thread-Ersteller nix,
dann geht es eben darum, dieses Verhalten zu erzwingen ;) :
was ich dort ausgebe brauche ich im richtigen programm als double aber eben nicht 0.7000..1 sondern 0.7. (wie in dem beispiel)

wieso ist die Methode bei 0.7 nicht so nett?

Code:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {
        for (int i = 0; i < 40; i++)
        {
            double d2 = i * (double)0.02;
            double d = d2 * 100;
            d = (int)(d + 0.5);
            d = d / 100;
            System.out.println(d + " - " + d2);
        }
    }

}
funktioniert vorerst, aber kann man dem letzten Schritt, dem /100, immer vertrauen?
 

Marco13

Top Contributor
@SlaterB: Ich wollte da nur einiges grundsätzlich in Frage stellen....

dermoritz hat gesagt.:
die 0.02 ist eine variabele, das ganze soll also für alle möglichen anderen faktoren funktionieren. (probiert mal 0.3 ;-))

Und probier' du mal 0.123456789123456789123456789 oder 10e100 :wink:

Wenn es um eine "schöne" Ausgabe geht (und NUR dann, wenn es NUR um die Ausgabe geht!) kann man da ja mit String.format bzw. NumberFormat arbeiten.....
 

xysawq

Bekanntes Mitglied
Also wenn ich das richtig sehe hat SlaterB sowieso nur meine "Lösung" in eine Methode gepackt und nochmal gepostet (ok, ganz leicht umformatiert)...

Und außerdem glaube ich nicht, dass der gute Moritz Zahlen wie 0.123456789123456789123456789 oder 10e100 ausgeben möchte, denn dann wäre er sich auch nicht zu schade 'round' zu importieren ;)
 

dermoritz

Bekanntes Mitglied
danke bis hier hier her. an sowas wie "round" hab ich auch gedacht nur brauch ich die möglichkeit die anzahl der dezimalstellen festzulegen.
und wie gesagt die anzahl der dezimalstellen wird von einer eingabe größe bestimt.

inzwischen hab ich folgendes gemacht:

Code:
Double factor=0.1;
	  int power_of_ten=(int)Math.ceil(Math.abs(Math.log10(factor)));	
	  for(int i=0;i<40;i++){
		  System.out.println((i*(Math.pow(10,power_of_ten)* factor))/Math.pow(10,power_of_ten));
	  }

das erscheint mir aber alles irgendwie zu kompliziert für so eine billige geschichte?! in machen programmiersprachen kann man direkt nach den dezimalstellen einer zahl fragen bzw. beim runden diese festlegen.

da das mit dem runden so ein grundsätzlichen und alltägliches problem ist, sollte es doch ein lösung geben die einfach ist, oder?

(mir ist die problematik mit der internen darstellung klar, aber von einer sprache wie java die einem alles "wegabstrahieren" kann erwarte ich irgendwie auch, dass ich nicht mit der internen darstellung von double/float zahlen rumärgern muss.)


edit:
"bigdecimal" genau sowas suche ich - ein zahelnformat was von ieee-interner darstellung abstrahiert. ich schaus mir mal an...
 

dermoritz

Bekanntes Mitglied
danke the_29 ich hab das mal mit bigdecimal probiert, wunderbar genau nach sowas hab ich gesucht:

Code:
factor=0.03;
 MathContext mc= new MathContext(2);
 for(int i=0;i<40;i++){
 BigDecimal erg=new BigDecimal(i*factor,mc);	  
 System.out.println(erg.doubleValue());
	  }

das....doubleValue() ist nur zum test - ich brauche ja letztendlich einen double. aber mit dem weg über bigdecimal sind sie präzise.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Double Wert nach n abschneiden ohne zu runden Java Basics - Anfänger-Themen 1
D Einmal Runden ohne alles Java Basics - Anfänger-Themen 7
M Klasse in Runden Klammern bei Objektimplementierung Java Basics - Anfänger-Themen 4
S Runden auf den niedrigsten Wert Java Basics - Anfänger-Themen 10
Z Runden Arraylist Java Basics - Anfänger-Themen 9
A Random Double mit Math.round() runden? Java Basics - Anfänger-Themen 1
J Hilfe beim Runden Java Basics - Anfänger-Themen 4
S Runden von Zahlen Java Basics - Anfänger-Themen 1
J Fehler beim Runden Java Basics - Anfänger-Themen 3
T ungewolltes Runden Java Basics - Anfänger-Themen 5
K Double Wert runden und in Int umwandeln Java Basics - Anfänger-Themen 7
A Kaufmännisches Runden mit BigDecimal Java Basics - Anfänger-Themen 14
M Double Wert auf 2 Kommastellen runden Java Basics - Anfänger-Themen 2
K Methoden Integer runden/aufrunden Java Basics - Anfänger-Themen 2
F Zeiteinheit auf ganze Zahl runder runden Java Basics - Anfänger-Themen 4
L Nachkommastellen Runden, Problem mit Syntax " }" Java Basics - Anfänger-Themen 2
J Auf den nächsten Zehner runden? Java Basics - Anfänger-Themen 4
C Nach Berechnung runden und Wert ausgeben Java Basics - Anfänger-Themen 7
A Richtig runden Java Basics - Anfänger-Themen 9
M Double-Zahlen auf Intervalle runden Java Basics - Anfänger-Themen 3
H Runden klappt nicht Java Basics - Anfänger-Themen 10
S Zahlen runden Java Basics - Anfänger-Themen 5
E Runden Java Basics - Anfänger-Themen 2
U Erste Schritte Kommazahl runden Java Basics - Anfänger-Themen 17
K Große Gleitkommazahlen runden Java Basics - Anfänger-Themen 8
Luk10 Nachkommastellen runden Java Basics - Anfänger-Themen 2
S Runden eines doubles auf n nachkommastellen Java Basics - Anfänger-Themen 10
H Zahl auf 2 nachkomma stellen runden Java Basics - Anfänger-Themen 13
M Float auf bestimmte Nachkommazahl runden Java Basics - Anfänger-Themen 3
I Runden / Zweikommastellen geht nicht... Java Basics - Anfänger-Themen 3
J Konvertieren und Runden von double in int Java Basics - Anfänger-Themen 3
H Datentypen Rechnen und Runden Java Basics - Anfänger-Themen 2
O Runden - x/100 liefert long zurück Java Basics - Anfänger-Themen 7
T Runden mit Präzision vs. Runden mit Nachkommastellen Java Basics - Anfänger-Themen 4
J Runden mit printf Java Basics - Anfänger-Themen 3
-horn- Runden auf x-Stellen wirklich nur so umständlich? Java Basics - Anfänger-Themen 9
F (Verständnis)Problem: Zahl auf 2 Nachkommastellen runden Java Basics - Anfänger-Themen 5
Rika Runden Java Basics - Anfänger-Themen 6
F Werte runden Java Basics - Anfänger-Themen 11
N Runden Java Basics - Anfänger-Themen 6
J Runden auf 2 Nachkommastellen ? Java Basics - Anfänger-Themen 5
D Einfache Funktion zum kaufmännischen runden Java Basics - Anfänger-Themen 8
J richtig runden Java Basics - Anfänger-Themen 4
B Double je nach Nachkommastellen kfm runden Java Basics - Anfänger-Themen 7
J Runden Java Basics - Anfänger-Themen 4
G divisions ergebnis runden Java Basics - Anfänger-Themen 3
P Runden auf eine Nachkommastelle Java Basics - Anfänger-Themen 18
S Wie runden man noch mal auf bestimmte stellen? Java Basics - Anfänger-Themen 8
S double runden Java Basics - Anfänger-Themen 5
W Runden Java Basics - Anfänger-Themen 10
G Durch Liste iterieren und nachkommastellen runden Java Basics - Anfänger-Themen 9
C Ergebnisse auf 2 Kommastellen runden Java Basics - Anfänger-Themen 3
R Zahl runden Java Basics - Anfänger-Themen 18
M Runden eines Doublewerts auf 13 Zeichen Java Basics - Anfänger-Themen 10
A Runden Java Basics - Anfänger-Themen 5
G Kein Runden Java Basics - Anfänger-Themen 3
R "Kaufmännisch runden" Java Basics - Anfänger-Themen 12
P Automatisch auf die nächst höere zahl runden? Java Basics - Anfänger-Themen 7
F Long umwandeln und auf 2 Dezimalen runden? Java Basics - Anfänger-Themen 14
M runden Java Basics - Anfänger-Themen 9
P Dezimalstellen limitieren (runden auf 2 Stellen) Java Basics - Anfänger-Themen 3
L Automatischen Runden oder Abschneiden? Java Basics - Anfänger-Themen 2
C Runden auf 2 Nachkommastellen klappt nicht||| WARUM Java Basics - Anfänger-Themen 13
S Double runden funktioniert nicht immer ? Java Basics - Anfänger-Themen 2
O Dezimal in Dual...Arraygröße & Runden Java Basics - Anfänger-Themen 4
A Bestimmt blöde Frage: Zahl runden Java Basics - Anfänger-Themen 10
K Fliesskommawert runden Java Basics - Anfänger-Themen 3
L Runden Java Basics - Anfänger-Themen 2
G Zahlen runden Java Basics - Anfänger-Themen 3
C double runden Java Basics - Anfänger-Themen 6
V Double runden Java Basics - Anfänger-Themen 6
D Zahlen runden Java Basics - Anfänger-Themen 10
F double wert formatieren und runden Java Basics - Anfänger-Themen 7
C Runden einer Altersangabe Java Basics - Anfänger-Themen 5
P double Zahl runden Java Basics - Anfänger-Themen 2
J Delay erzeugen, ohne Programm zu blockieren Java Basics - Anfänger-Themen 7
P Main Methode scheint Constructor aufzurufen, ohne dass es so gecoded ist Java Basics - Anfänger-Themen 2
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
V JSON-Objs aus JSON-Obj filtern und löschen (Manipulation ohne Kenntnis der vollst. Struktur) Java Basics - Anfänger-Themen 12
O HashTable kann ohne Performance-Verlust in Multithreaded-Anwendungen eingesetzt werden. Java Basics - Anfänger-Themen 6
T Mehrere if bedingungen ohne & Java Basics - Anfänger-Themen 2
M methode aufrufen ohne parameter Java Basics - Anfänger-Themen 1
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
G Programm läuft durch, ohne Eingabe aus dem Chat abzuwarten Java Basics - Anfänger-Themen 4
Mugetsu35 ArrayList Update ohne Index Java Basics - Anfänger-Themen 6
P 2n Potenzieren ohne Math.pow oder pow Java Basics - Anfänger-Themen 8
M 2d array ohne längen anlegen Java Basics - Anfänger-Themen 4
Zentriks Hilfe zu Sieb des Eratosthenes ohne boolean Java Basics - Anfänger-Themen 5
W GUI - JButton ohne Funktion? Java Basics - Anfänger-Themen 24
X Enum Abfrage ohne if, for, while oder switch Java Basics - Anfänger-Themen 21
R Buttons ohne Funktion Java Basics - Anfänger-Themen 2
JavaBeginner22 TextArea, ohne Zeilenumbruch? Java Basics - Anfänger-Themen 4
frager2345 Programm erstellen ohne Autoboxing und Unboxing Java Basics - Anfänger-Themen 13
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 0
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 5
S Was macht ++ ohne Schleife? Java Basics - Anfänger-Themen 4
berserkerdq2 An selbst ersteller txt Datei immer Text dranhängen, ohne den vorherign Text zu löschen Java Basics - Anfänger-Themen 8
U Methode wird genutzt, ohne dass ich die aufrufe? Java Basics - Anfänger-Themen 4
B Jar Dateien ohne IDE verwenden? Java Basics - Anfänger-Themen 1
M Wie verknüpfe ich eine Bedingung mit einer Methode ohne if-Verzweigung & Bedingungsoperator? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben