0

Logarithmus_10 (log) von 1000, einer Million, einer Milliarde, ....

Hallo.

Ich dachte, ich könnte die Anzahl Stellen einer Zahl über den LOG10 berechnen, um zu erkennen, wann ich mich in einer neuen 10-er Potenz befinde.

log(10) bringt wie erwartet die 1, log(100) = 2, so weit so gut. Die Anzahl Stellen wäre dann bei Erreichen einer Ganzzahl über log(number(Nr)) im Vergleich zur Länge von text(number(Nr)) zu erkennen.

Leider bringt log(1000) nicht etwa die erwartete 3, sondern 2.9999999999999996

pow(10, 2.9999999999999996) ergibt tatsächlich 999,999999999999, und bei pow(10,3) wirft mir die Console 1000 aus.

log(n) ist dann auch bei einer Million (1000 x 1000) keine 6, und bei einer Milliarde (100000 x 1000) keine 9.

Ist das ein Bug im System oder in meinem Kopf?   

5 Antworten

null
    • Hubner_Thomas
    • vor 3 Jahren
    • Gemeldet - anzeigen

    - Bei einer Milliarde fehlt eine 0, sorry, 1000000 x 1000

    • mirko3
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Nur mal eine Mutmaßung: Ninox weist hier Zahlen den Typ "double" zu, also Gleitkommazahl 64 Bit, das sind 15 Dezimalstellen. Double weist auf doppelte Genauigkeit hin, was aber nicht wörtlich zu nehmen ist, sondern nur die doppelte Genauigkeit bezüglich dem Zahlentyp "float" mit 32 Bit und 6 Dezimalstellen. Sie werden intern als Bruch gespeichert. Dadurch hat dieser Zahlentyp unter Umständen in bestimmten Rechenschritten eine sehr kleine Ungenauigkeit. Ist also kein Bug. Für Deinen Zweck ist also die Methode log ungeeignet, oder Du benutzt round(). Was willst Du eigentlich bezwecken? Hast Du schon ein Workaround? Gruß Mirko

    • Hubner_Thomas
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo!

    Danke für die Antwort.

    Nicht-IT Personen rennen mir die Bude ein, weil "die Sortierung falsch ist". Du kennst das ja: 1, 10, ... 101, 102,..., 2, ... ist im Kopf von den Leute einfach nicht richtig.

    Daher wollte ich über den log(Nr) die Zehnerpotenz eines Index herausbekommen und bei neuer Potenz, also log(Nr) = Zahl ohne Nachkommastellen (-> 10 = 1, 100 = 2, 1000!!), den Index aller vorhandenen Datensätze mit Index := lpad(Nr, log(Nr)+1, "0") um eine Stelle erweitern. Damit erreiche ich als Sortierung 001, 002, ... 010, ... 100, die Leute sind happy, und ich habe meine Ruhe. 

    Workaround:

    let me := this;
    Index := "XX-" + lpad(text(me.Nr), length(text(me.Nr)), "0");
    let firstRec := first(select Tabelle_1);
    if length(me.Index) > length(firstRec.Index) then
    for i in select Tabelle_1 do
    i.(Index := "XX-" + lpad(text(i.Nr), length(text(me.Nr)), "0"))
    end
    end

    • mirko3
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Mit Deinem Code kreierst Du teilweise völlig neue Ergebnisse. Wenn es so gewollt ist, dann okay. Wenn es Dir um Sortierung vorhandener Ziffern in Textfeldern geht, dann kommst Du um ein Auffüllen auf eine Gesamtziffernanzahl nicht umhin, da 02 ja immer noch nach 010 steht, reicht eine 0 nicht aus.
    Also einfach lpad pur benutzen (wie Leo empfohlen hat), dann hast Du sortierbare "Zahlen" im Textfeld. Du kannst jederzeit auch noch Buchstaben davorschreiben.
    Dann würden sich Deine Nicht-IT Personen vielleicht auch freuen über eine automatische Vergabe von Nummern. Dazu gibt es genügend Threads im Forum, oder das leicht geänderte Script ohne for-Schleife in den Trigger des Index-Felds schreiben, ändert die Zahl gleich nach jeder Eingabe (Index := lpad(Index, 6, "0")).
    Oder Dein Problem existiert gar nicht mehr, weil Du es gelöst hast;-)
    *

    for i in select Tabelle_1 do
    i.(Index := lpad(i.Index, 6, "0"))
    end

    *

    • Hubner_Thomas
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Ja, danke, mein Code oben löst das. 

    Wir schießen mit solchen Routinen ja nicht auf steuerrelevante Datenfelder. Das neue Ergebnis ist tatsächlich gewollt.   

    Der Index besteht aus einem eindeutigen Kürzel je Tabelle + Nr in formatierter Form. Hauptsächlich dient das zur Sortierung von Datensätzen in "numerischer" Reihenfolge,.

    Die Zahlen sollen so wenig Stellen wie möglich, aber so viele Stellen wie nötig haben. Daher das Update auf die älternen Datensätze anstatt einer vordefinierten Länge.