Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 16 bis 30 von 43
  1. #16
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.667

    AW: Richtig runden.

    Zitat Zitat von mikdoe Beitrag anzeigen
    Soviel zum Thema "immer mit Ganzzahlen arbeiten".
    du arbeitest ja nicht mit ganzzahlen. dein problem ist ja nicht die multiplikation, sondern .57.


    Zitat Zitat von mikdoe Beitrag anzeigen
    Daher: Auch das Arbeiten mit Ganzzahlen ist kein Allheilmittel.
    http://www.youtube.com/watch?v=tPfnEByx9r0


    Zitat Zitat von mikdoe Beitrag anzeigen
    Ich weiß allerdings nicht, ob es diese Fallgrube auch in JS gibt. Würde mich mal interessieren.
    das ist sprachunabhängig

  2. #17
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Richtig runden.

    Zitat Zitat von mikdoe Beitrag anzeigen
    Davon geht man bei Perl wahrscheinlich auch aus, ist aber nicht so, wie das Beispiel beweist.
    Welches Beispiel? Dein Beispiel war ja eines, wo du zeigst wie man es nicht macht. Du musst natürlich auch eine Zahl explizit in eine Ganzzahl umwandeln und das macht dein Beispiel nicht.

    Zitat Zitat von kkapsner Beitrag anzeigen
    - 'tschuldigung. Hatte mich vertippt. Meinte natürlich 4.93 - aber deine Funktion spuckt 4.94 aus.
    .toFixed(2) auch.

    Zitat Zitat von kkapsner Beitrag anzeigen
    Natürlich kann JS soviele Stellen darstellen Number.MIN_VALUE ist 5e-324 (und z.B. 1st 1.0000000000000001 !== 1.0000000000000002). Es ist nur an der Grenze und wird intern genauso gespeichert wie 4.935 - zu welcher Zahl jetzt "richtig" gerundet werden soll, ist jetzt fraglich.
    Auch "rundet" alert(4.9349999999999999.toFixed(16)) nicht mehr zu 4.9350...
    Bei mir sieht das anders aus: alert(4.9349999999999999) => 4.935 oder
    zahl = 4.9349999999999999;
    alert(4.935 === zahl); // => true

    Wobei diese problematik wohl nur akademischen Wert haben dürfte. Da diese Zahlen bei der Berechnung von Währungen in der Realität nicht vorkommen sollten.

  3. #18
    Avatar von mikdoe
    mikdoe ist offline Administrator
    registriert
    01-05-2010
    Beiträge
    7.739

    AW: Richtig runden.

    Zitat Zitat von hesst Beitrag anzeigen
    du arbeitest ja nicht mit ganzzahlen. dein problem ist ja nicht die multiplikation, sondern .57.
    Na ja, nicht ganz. Das Problem ist, dass ich nach einer Mulitiplikation von .57 mit 100 laut print in der Variable 57 stehen habe. Das ist ein erwartetes Ergebnis.
    Dennoch schlägt 57==57 fehl. Denn intern speichert Perl nicht 57. Es ist also nur scheinbar eine Ganzzahl. Und sie wird erst nach sprintf() zu dieser.
    Wenn sie dann mal wirklich eine Ganzzahl ist (nach sprintf()) dann mag es ja im weiteren Verlauf ok sein. Aber ich würde das schon als Fallstrick bezeichnen.


    Sehr schön

    Zitat Zitat von hesst Beitrag anzeigen
    das ist sprachunabhängig
    Was genau jetzt? Dass die Wurzel aus 2 irrational ist oder dass mein gezeigtes Beispiel nur scheinbar eine Ganzzahl ist?

  4. #19
    Avatar von mikdoe
    mikdoe ist offline Administrator
    registriert
    01-05-2010
    Beiträge
    7.739

    AW: Richtig runden.

    Zitat Zitat von ein schlauer Beitrag anzeigen
    Dein Beispiel war ja eines, wo du zeigst wie man es nicht macht.
    Jau.

    Zitat Zitat von ein schlauer Beitrag anzeigen
    Du musst natürlich auch eine Zahl explizit in eine Ganzzahl umwandeln und das macht dein Beispiel nicht.
    Und das meinte ich mit Typecast. Würde ein vorhandenes Typecast nicht von selbst hieraus intern eine Ganzzahl machen?
    Sagen wir mal so, ob Typecast dafür jetzt der 100 % richtige Ausdruck ist, weiß ich nicht.
    Aber irgend wie ist das doch auf den ersten Blick verwirrend für manche, oder nicht?

  5. #20
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Diskussion zum Speichern/Anzeigen von Fließkomma- und Ganzzahlen

    Zitat Zitat von mikdoe Beitrag anzeigen
    Dieser Thread ist ein Extrakt aus Thread http://forum.jswelt.de/javascript/57...ig-runden.html (Richtig runden.)

    Ich mache solche Rechnung bewußt niemals in JS, weil ich auf den Browser und seine Rechnerei keinen Einfluss habe. Daher ist mein Mathematik-JS extrem beschränkt.
    Aber wenn ich müsste würde ich wohl mit soetwas wie z.B. Math.floor() die Ganzzahl eines Wertes ziehen und danach den Dezimalpunkt in der Zahl suchen mit soetwas wie indexOf() und abhängig von der dritten Stelle nach dem Dezimalpunkt (bei >4 soweit überhaupt vorhanden) zu meiner Ganzzahl eine addieren.
    Und ab diesem Punkt würde ich intern nur noch mit dieser Ganzzahl weiter rechnen und erst bei der Ausgabe (so spät wie möglich) wieder durch 100 dividieren zwecks Anzeige.
    Dein Beispiel 24,37 ist übrigens ungeeignet da es nicht gerundet werden muss. 24,375 als Ergebnis einer Rechnung wäre das bessere Beispiel. Da müsste dann 2438 als Ganzzahl rauskommen.

    Aber eine Warnung noch: Das garantiert auch nicht in allen Fällen den Erfolg! Auch bei der Umwandung in eine Ganzzahl können Fehler passieren. Selbst die Ur-Serversprachen wie z.B. Perl kommt bei solchen Aktionen (wg. fehlendem internen Typecast) manchmal an ihre Grenzen.
    Wenn es hier also um was geht, mach das weder mit JS noch mit Perl sondern in Sprachen die rechnen können, wie z.B. die C-Dialekte (hab ich mir sagen lassen).
    Du bringst eine Menge durcheinander. Zum einen die Problematik der Darstellung von Gleitkommazahlen und dann die Genaugkeit der Berechnungen.

    Die Darstellung einer Fließkommazahl mit einer festen Anzahl von Nachkommastellen kann immer problematisch sien, egal mit welcher Programmiersprache du das machst. Und die Genauigkeit einer Sprache hängt von deren internen Zahlenformat ab. Um die Genauigkeit zu erhöhen, gibt es in Perl auch diverse Module. Mit JS ist das nicht möglich. Aber um mit Währungen zu arbeiten ist eine solche Genauigkeit auch überflüssig, da du nur zwei Stellen brauchst, um dabei die interne Darstellung zu vermeiden wandelst du diese in Ganzzahlen um. Fertig.

    Was ist denn ein interner Typecast?

  6. #21
    Avatar von mikdoe
    mikdoe ist offline Administrator
    registriert
    01-05-2010
    Beiträge
    7.739

    AW: Diskussion zum Speichern/Anzeigen von Fließkomma- und Ganzzahlen

    Zitat Zitat von ein schlauer Beitrag anzeigen
    Was ist denn ein interner Typecast?
    Ich kann nur sagen, was ich mir darunter vorstelle: einen Mechanismus der dazu führt, dass das Ergebnis aus .57 x 100 intern als Ganzzahl abgespeichert wird, damit die interne Speicherung der Variable identisch mit dem per print angezeigten Wert ist.
    Fände ich zumindest wünschenswert.

  7. #22
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Richtig runden.

    Zitat Zitat von mikdoe Beitrag anzeigen
    Und das meinte ich mit Typecast. Würde ein vorhandenes Typecast nicht von selbst hieraus intern eine Ganzzahl machen?
    Nein, sowas gibt es nicht. Ein Typecast ist immer etwas erzwungenes, du musst also entweder int() - was aber rundet - oder mit sprintf runden.
    also z.b.
    Code:
    my $a = (sprintf('%0.0f', .57*100));

  8. #23
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.667

    AW: Richtig runden.

    Zitat Zitat von mikdoe Beitrag anzeigen
    Na ja, nicht ganz. Das Problem ist, dass ich nach einer Mulitiplikation von .57 mit 100 laut print in der Variable 57 stehen habe. Das ist ein erwartetes Ergebnis.
    nein ist es nicht! bei (57 *100)/100 ist es das erwartete Ergebnis

    Zitat Zitat von mikdoe Beitrag anzeigen
    Dennoch schlägt 57==57 fehl.
    nein, 56.999999999999995115018691649311222136020660400390625 == 57 schlägt fehl

    Zitat Zitat von mikdoe Beitrag anzeigen
    Was genau jetzt? Dass die Wurzel aus 2 irrational ist oder dass mein gezeigtes Beispiel nur scheinbar eine Ganzzahl ist?
    das .57 als 64-Bit Gleitkommazahl .56999999999999995115018691649311222136020660400390625... ist
    Geändert von tsseh (05-06-2013 um 09:50 Uhr) Grund: Quote repariert

  9. #24
    Avatar von mikdoe
    mikdoe ist offline Administrator
    registriert
    01-05-2010
    Beiträge
    7.739

    AW: Richtig runden.

    Zitat Zitat von hesst Beitrag anzeigen
    nein ist es nicht! bei (57 *100)/100 ist es das erwartete Ergebnis
    Das nützt ja nichts. Denn im Ursprungsthread war ja die Ausgangslage, dass man eine Fließkommazahl hat und empfohlen wurde, mit Ganzzahlen zu rechnen. Da komme ich ja nur über .57 x 100 hin. Oder ich verschiebe mit String-Funktionen das Komma zwei Stellen nach rechts, das war ja mein Alternativvorschlag, um dieses Problem hier zu umgehen, und kkapsner's Vorschlag dazu schien mir genau das zu machen.

    Zitat Zitat von hesst Beitrag anzeigen
    nein, 56.999999999999995115018691649311222136020660400390625 == 57 schlägt fehl
    Ja, ist mir klar.
    Wieso kommt bei print nicht 56.999999999999995115018691649311222136020660400390625 zur Anzeige?
    Darf man nicht davon ausgehen, dass ein einfaches print/echo/say oder sonst was den tatsächlichen Inhalt einer Variable anzeigt?
    Geändert von mikdoe (05-06-2013 um 09:53 Uhr)

  10. #25
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.667

    AW: Richtig runden.

    Zitat Zitat von mikdoe Beitrag anzeigen
    Das nützt ja nichts. Denn im Ursprungsthread war ja die Ausgangslage, dass man eine Fließkommazahl hat und empfohlen wurde, mit Ganzzahlen zu rechnen. Da komme ich ja nur über .57 x 100 hin.
    da kommst du über eine Kettenbruchentwicklung hin. musst du aber nicht, da geld keine 0.57 € kennt sondern nur 0 € 57 cent.


    Zitat Zitat von mikdoe Beitrag anzeigen
    Wieso kommt bei print nicht 56.999999999999995115018691649311222136020660400390625 zur Anzeige?
    my $a = .57*100;
    printf "%.16f", $a;
    Geändert von tsseh (05-06-2013 um 10:20 Uhr)

  11. #26
    Avatar von mikdoe
    mikdoe ist offline Administrator
    registriert
    01-05-2010
    Beiträge
    7.739

    AW: Richtig runden.

    Zitat Zitat von hesst Beitrag anzeigen
    musst du aber nicht, da geld keine 0.57 € kennt sondern nur 0 € 57 cent.
    Jetzt drehen wir uns im Kreis. Wie kommt man denn am besten von Euro zu Cent ohne darüber zu stolpern, dass 0.57 x 100 nicht 57 ist?

    Zitat Zitat von hesst Beitrag anzeigen
    printf "%.16f", $a;
    Nee, das hatten wir schon. Ich habe nicht nach einer anderen Lösung gefragt sondern warum print ohne weitere Formatierung nicht das anzeigt, was die Variable wirklich enthält.

  12. #27
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Diskussion zum Speichern/Anzeigen von Fließkomma- und Ganzzahlen

    Wieso print zeigt doch das an was die Variabel enthält:
    Code:
    my $a = .57 * 100;
    print $a; # => 57
    Was dein Problem ist, dass int auf 56 kürzt, weil die Zahl in Wrklichkeit kleiner als 57 ist.

    EDIT: Ok, ich hatte grad einen Knoten im Hirn. print zeigt nicht alle Nachkomastellen an
    To what precision does perl print floating-point numbers? - Stack Overflow
    Geändert von ein schlauer (05-06-2013 um 12:47 Uhr)

  13. #28
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.667

    AW: Richtig runden.

    Zitat Zitat von mikdoe Beitrag anzeigen
    Jetzt drehen wir uns im Kreis. Wie kommt man denn am besten von Euro zu Cent ohne darüber zu stolpern, dass 0.57 x 100 nicht 57 ist?
    eigentlich nicht, wir haben nie 0.57. wenn aber doch, warum nehmen wir nicht die 2 stellen nach dem "."?


    Zitat Zitat von mikdoe Beitrag anzeigen
    Nee, das hatten wir schon. Ich habe nicht nach einer anderen Lösung gefragt sondern warum print ohne weitere Formatierung nicht das anzeigt, was die Variable wirklich enthält.
    ja und was soll das sein? woher soll print wissen, in welcher genauigkeit du den wert anzeigen willst? das kann man ja extra angeben, weil man das nicht sagen kann. da gibt es irgendeine defaulteinstellung, ob die nun in den meisten fällen richtig ist, wer will das sagen?

  14. #29
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Richtig runden.

    Zitat Zitat von hesst Beitrag anzeigen
    ja und was soll das sein? woher soll print wissen, in welcher genauigkeit du den wert anzeigen willst? das kann man ja extra angeben, weil man das nicht sagen kann. da gibt es irgendeine defaulteinstellung, ob die nun in den meisten fällen richtig ist, wer will das sagen?
    die steckt hier C <float.h> Library

    FLT_DIG 6

    DBL_DIG 10

    LDBL_DIG 10
    These macros define the maximum number decimal digits (base-10) that can be represented without change after rounding.

  15. #30
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.667

    AW: Richtig runden.

    Zitat Zitat von ein schlauer Beitrag anzeigen
    die steckt hier C <float.h> Library
    dann müsste aber DBL_DIG aber 15 sein und FLT_DIG 7
    und perl nutzt doch sicher auch double, oder? damit hat man wider min. 15 unterscheidbare ziffern und print müsste 56.999999.. anzeigen.

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Ähnliche Themen

  1. Antworten: 9
    Letzter Beitrag: 09-10-2013, 11:52
  2. Antworten: 4
    Letzter Beitrag: 19-12-2012, 23:06
  3. Antworten: 3
    Letzter Beitrag: 19-10-2011, 08:18
  4. Antworten: 0
    Letzter Beitrag: 07-08-2011, 10:28
  5. Math.round Problem mit rundung bei Ganzzahlen
    Von siggedy im Forum JavaScript
    Antworten: 2
    Letzter Beitrag: 01-12-2010, 01:14

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •