hilfdirselbst.ch
Facebook Twitter gamper-media

**********************************************
        Facelifting HDS: Danke für deine Unterstützung!

**********************************************


Gerald Singelmann  M  p
Beiträge: 6178
1. Jan 2018, 22:41
Beitrag #1 von 11
Bewertung:
(2368 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Kurioses Rundungproblem


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?

--------------------------

InDesign-Wissen und Automatisierung nicht nur rund um die Suite.

http://www.cuppascript.com Top
 
X
Kai Rübsamen  M  p
Beiträge: 4484
2. Jan 2018, 00:40
Beitrag #2 von 11
Beitrag ID: #561626
Bewertung:
(2353 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Kurioses Rundungproblem


Hallo Gero, Frohes Neues :)

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

Gruß Kai Rübsamen
_______________________
als Antwort auf: [#561625] Top
 
WernerPerplies
Beiträge: 2184
2. Jan 2018, 08:07
Beitrag #3 von 11
Beitrag ID: #561627
Bewertung:
(2333 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Kurioses Rundungproblem


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?

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#561625] Top
 
Gerald Singelmann  M  p
Beiträge: 6178
2. Jan 2018, 08:53
Beitrag #4 von 11
Beitrag ID: #561628
Bewertung:
(2326 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Kurioses Rundungproblem


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?

--------------------------

InDesign-Wissen und Automatisierung nicht nur rund um die Suite.

http://www.cuppascript.com
als Antwort auf: [#561627] Top
 
WernerPerplies
Beiträge: 2184
2. Jan 2018, 09:17
Beitrag #5 von 11
Beitrag ID: #561629
Bewertung:
(2320 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Kurioses Rundungproblem


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 


Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#561628]
(Dieser Beitrag wurde von WernerPerplies am 2. Jan 2018, 09:32 geändert)
Top
 
Kai Rübsamen  M  p
Beiträge: 4484
2. Jan 2018, 11:51
Beitrag #6 von 11
Beitrag ID: #561633
Bewertung:
(2275 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Kurioses Rundungproblem


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!

Gruß Kai Rübsamen
_______________________
als Antwort auf: [#561629] Top
 
Uwe Laubender S
Beiträge: 4039
2. Jan 2018, 12:14
Beitrag #7 von 11
Beitrag ID: #561634
Bewertung:
(2269 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Kurioses Rundungproblem


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.
*****
Mit herzlichem Gruß,
Uwe Laubender
als Antwort auf: [#561633] Top
 
WernerPerplies
Beiträge: 2184
2. Jan 2018, 13:19
Beitrag #8 von 11
Beitrag ID: #561637
Bewertung:
(2255 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Kurioses Rundungproblem


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())) 

?

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#561633]
(Dieser Beitrag wurde von WernerPerplies am 2. Jan 2018, 13:33 geändert)
Top
 
WernerPerplies
Beiträge: 2184
2. Jan 2018, 13:33
Beitrag #9 von 11
Beitrag ID: #561638
Bewertung:
(2251 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Kurioses Rundungproblem


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!

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#561634] Top
 
Kai Rübsamen  M  p
Beiträge: 4484
2. Jan 2018, 14:37
Beitrag #10 von 11
Beitrag ID: #561641
Bewertung:
(2232 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Kurioses Rundungproblem


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.

Gruß Kai Rübsamen
_______________________
als Antwort auf: [#561638] Top
 
WernerPerplies
Beiträge: 2184
2. Jan 2018, 15:04
Beitrag #11 von 11
Beitrag ID: #561642
Bewertung:
(2225 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Kurioses Rundungproblem


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!

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler jetzt mit Vollwaschgang
Aktuelles
XING
als Antwort auf: [#561641] Top
 
X