[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Kurioses Rundungproblem

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Kurioses Rundungproblem

Gerald Singelmann
  
Beiträge gesamt: 6269

1. Jan 2018, 22:41
Beitrag # 1 von 11
Bewertung:
(3612 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,

ein Kuriosum zum Neuen Jahr...

Lasst mal diesen kleinen Script-Schnipsel im ESTK laufen:
Code
$.writeln( Math.round( 119 * 1.45 * 10) ); 
$.writeln( Math.round( 119 * (1.45 * 10) ) );


In meiner Script-Konsole steht danach:
Zitat 1725
1726


Bei euch auch?
X

Kurioses Rundungproblem

Kai Rübsamen
Beiträge gesamt: 4684

2. Jan 2018, 00:40
Beitrag # 2 von 11
Beitrag ID: #561626
Bewertung:
(3597 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Gero, Frohes Neues :)

Bei mir auch. Richtig wäre die zweite Variante. Keine Ahnung, warum die erste falsch ist.


als Antwort auf: [#561625]

Kurioses Rundungproblem

WernerPerplies
Beiträge gesamt: 2762

2. Jan 2018, 08:07
Beitrag # 3 von 11
Beitrag ID: #561627
Bewertung:
(3577 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Guten Morgen Herr Singelmann,

Zitat Bei euch auch?


Ja.

Von der Interpretation her sind die beiden Ausdrücke nicht identisch, Klammern werden von innen nach außen aifgelöst.

Der erste Ausdruck bedeutet dann wohl:
119 * 1.45 * 10 = 1725.5

Der zweite Ausdruck
1.45 * 10 = 14.5

14.5*119 = 1725.5

Mit dem Windows-Rechner sieht das so aus:

erster Ausdruck:
119*1,45
172,55 *10
1725,5 -> abgerundet

zweiter Ausdruck:
1,45*10
14,5*119
172,55 -> aufgerundet

Also alles komplett korrekt, oder?


als Antwort auf: [#561625]

Kurioses Rundungproblem

Gerald Singelmann
  
Beiträge gesamt: 6269

2. Jan 2018, 08:53
Beitrag # 4 von 11
Beitrag ID: #561628
Bewertung:
(3570 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zitat Also alles komplett korrekt, oder?


In beiden Zeilen steht, meinem Mathematikverständnis zufolge, NACH dem Mltiplizieren:

Code
Math.round(1725.5) 


Wieso wird dieselbe Zahl mal auf-, mal abgerundet?

In welchem Kontext ist es korrekt, dass ##.5 abgerundet wird?


als Antwort auf: [#561627]

Kurioses Rundungproblem

WernerPerplies
Beiträge gesamt: 2762

2. Jan 2018, 09:17
Beitrag # 5 von 11
Beitrag ID: #561629
Bewertung:
(3564 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Herr Singlemann,

irgenwie scheint das Erklären nicht mein Ding zu sein.

Also noch ein Versuch:

Ursache für das unterschiedliche Verhalten ist die innere Klammer des zweiten Falles, der Inhalt wird zuerst berechnet.

Zitat In welchem Kontext ist es korrekt, dass ##.5 abgerundet wird?


Da haben Sie mich erwischt! Sorry, nein, natürlich nicht.

Also versuchen wir es mal mit der zweiten Erklärung:

Computer haben ja intern so Ihre Probleme mit der Rechengenauigkeit.

Könnte es vielleicht sein, dass im ersten Fall intern ein Wert kleiner ##.5 berechnet wurde und schon in der ersten Festkommadarstellung gerundet war, dieses Problem aber mit der Zwischenberechnung (##.55) nicht auftritt?

Dieser Ausdruck deutet auf jeden Fall darauf hin:
Code
Math.round((119*1.45*10).toString()) -> 1276 


und noch einen
Code
119*1.45*10 < 1725.5 ->true 



als Antwort auf: [#561628]
(Dieser Beitrag wurde von WernerPerplies am 2. Jan 2018, 09:32 geändert)

Kurioses Rundungproblem

Kai Rübsamen
Beiträge gesamt: 4684

2. Jan 2018, 11:51
Beitrag # 6 von 11
Beitrag ID: #561633
Bewertung:
(3519 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Werner, deine Erklärung ist nicht hilfreich ;-)

Wie Gero bereits geschrieben hat, kommt in beiden Fällen 1725.5 raus. Versch. Tests lassen vermuten, dass nicht schon zwischendurch gerundet wird. Lt. Erklärung bei mozilla wird ab 0.5 generell aufgerundet.

Antwort auf: Dieser Ausdruck deutet auf jeden Fall darauf hin:
Code
Math.round((119*1.45*10).toString()) -> 1276

Bei mir ist hier das Ergebnis 1725!


als Antwort auf: [#561629]

Kurioses Rundungproblem

Uwe Laubender
Beiträge gesamt: 5316

2. Jan 2018, 12:14
Beitrag # 7 von 11
Beitrag ID: #561634
Bewertung:
(3513 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,
in meinem ESTK 4.0.0.1 auf OS X 10.6.8 kommt bei:
Code
Math.round((119*1.45*10).toString()); 

1726 heraus.

Allerdings erzielt $.writeln() ein anderes Ergebnis:
Code
$.writeln(Math.round( 119 * 1.45 * 10)) 

Da wird 1725 ausgegeben.


als Antwort auf: [#561633]

Kurioses Rundungproblem

WernerPerplies
Beiträge gesamt: 2762

2. Jan 2018, 13:19
Beitrag # 8 von 11
Beitrag ID: #561637
Bewertung:
(3499 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,
Zitat Bei mir ist hier das Ergebnis 1725!

Dann würde ich den Rechner zurückgeben! :-)
Zitat Math.round((119*1.45*10).toString())

Hast Du diese Zeile wirklich so in die Konsole des ESTKs eingegeben?
Was ist mit dem Vergleich?
Code
119*1.45*10 < 1725.5 

true or false?
Was mit
Code
Math.round(parseFloat((119*1.45*10).toString())) 

?


als Antwort auf: [#561633]
(Dieser Beitrag wurde von WernerPerplies am 2. Jan 2018, 13:33 geändert)

Kurioses Rundungproblem

WernerPerplies
Beiträge gesamt: 2762

2. Jan 2018, 13:33
Beitrag # 9 von 11
Beitrag ID: #561638
Bewertung:
(3495 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

Allerdings erzielt $.writeln() ein anderes Ergebnis:
Code

Code
$.writeln(Math.round( 119 * 1.45 * 10)) 


Das ist ja auch etwas Anderes!

119 * 1.45 * 10 ist ein [b]Float, < 1725.5

Zitat (119*1.45*10).toString()

ist ein String 1725.5, der automatisch in Math.round vor dem Round in ein Float umgewandelt wird, dabei beträgt der Wert genau [b]1725.5.

Als ordenlicher Programierer sollte man es aber genau so machen:

Code
Math.round(parseFloat((119*1.45*10).toString())) 


Dabei vermeidet man die automatische Typumwandlung, die gerne schon mal schief gehen kann, und teilt dem System genau mit, was man machen möchte:
1. eine Multiplikation von Integer mit Float und Integer.
-> das ist die Theorie, JavaScript kennt, soweit ich weiß, nur Floats und keine Integers.
2. die Umwandlung in einen String bewirkt, das das System den eigentlichen Wert des ursprünglichen Floats nicht mehr kennt.
3. parseFloat macht aus dem String nun ein Float mit dem exakten Wert von 1725.5.

Alles klar?

Schade, dass der Editor die Bold-Auszeichnung nicht beherrscht!


als Antwort auf: [#561634]

Kurioses Rundungproblem

Kai Rübsamen
Beiträge gesamt: 4684

2. Jan 2018, 14:37
Beitrag # 10 von 11
Beitrag ID: #561641
Bewertung:
(3476 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf: Schade, dass der Editor die Bold-Auszeichnung nicht beherrscht!

Es liegt wie immer, an dem, der ihn bedient ;-)

Ich hatte meine Zahl mit $.writeln() ermittelt.


als Antwort auf: [#561638]

Kurioses Rundungproblem

WernerPerplies
Beiträge gesamt: 2762

2. Jan 2018, 15:04
Beitrag # 11 von 11
Beitrag ID: #561642
Bewertung:
(3469 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Kai,

Zitat Es liegt wie immer, an dem, der ihn bedient ;-)

Wenn's nur so einfach wäre, im Beitrag ID: #561629 hat es funktioniert, im Beitrag ID: #561638 nicht, in diesem Beitrag ja
Und immer die gleiche Syntax, ich hätte ein Screenshot machen sollen.

Zitat Ich hatte meine Zahl mit $.writeln() ermittelt.

Wirklich so?
Code
$.writeln(Math.round((119*1.45*10).toString())) 

Versuche es bitte mal mit Copy and Paste!


als Antwort auf: [#561641]
X