differenz zweiter double als integer ausgeben

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von vico255.

    @vico255 Also bei mir ist -0,00008‬ <> -8 :!:
    Nimm die Zahl, die bei Dir tatsächlich rauskommen soll, also wohl die 8.0 und konvertiere sie nach int:

    VB.NET-Quellcode

    1. Dim iVal = CInt(8.0)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Private Function x(ByVal d1 As Double, ByVal d2 As Double) As Integer
    2. Dim L As Integer = d1.ToString.Length - Math.Truncate(d1).ToString.Length - 1
    3. Return d1 * 10 ^ L - d2 * 10 ^ L
    4. End Function


    funktioniert nicht bei 1,2-1,17
    In Arbeit...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vico255“ ()

    Ich finde die Anforderung etwas seltsam. Magst du uns etwas mehr zu den Hintergründen verrtaten?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Man könnte auch einfach den Betrag der Differenz nehmen und solange mit 10 multiplizieren, bis es keine Nachkommastelle mehr gibt. Inhaltlich ist es aber fragwürdig. Wenn die Funktion aus einer Differenz von 0,2 eine 2 macht und aus einer 0,000000003 eine 3, welchen Informationswert hat das Ganze dann?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @vico255 So was:

    VB.NET-Quellcode

    1. Dim DEIN_INT_WERT = CInt(DEIN_DOUBLE_WERT * 100000)
    Die Zahl nach dem Sternchen mit den vielen Nullen musst Du natürlich Deinen Bedürfnissen anpasen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Es gibt auch den Bitpfriemler-Ansatz
    Eine Double wird in drei Teilen gespeichert: Vorzeichen,Exponent, Mantisse.
    Was du willst, ist die reine Mantisse.
    Du kannst einfach aus deiner Double die Bits 0..51 in ein Int64 schreiben und hast, was du willst.

    Falls sich jemand daran versuchen will, nur zu...

    openbook.rheinwerk-verlag.de/c…sdatentypen_008.htm#t2t34
    Bilder
    • 05_003[1].gif

      4,38 kB, 630×174, 3 mal angesehen
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    mrMo schrieb:

    Ich finde die Anforderung etwas seltsam. Magst du uns etwas mehr zu den Hintergründen verrtaten?


    Natürlich, es geht um Preisänderungen. Eine Ware ändert sich von zum Beispiel von 17.228 auf 17.24 in einem Zeitraum. Und ich möchte nicht die DoubleZahl sondern die Differenz als Ganzzahl.
    Allerdings habe ich selbst einen Fehler noch gefunden.

    Wenn 17.228 - 17.248 = -0.02 (Ich wollte 2 erhalten aber 20 wäre richtig) Ergo muss ich A-B ^ (Anz Nachkommastellen)

    So müsste es nun passen

    VB.NET-Quellcode

    1. Public Function NKS(ByVal d As Double) As Integer
    2. Return d.ToString.Split(CType(",", Char()))(1).Length
    3. End Function
    4. Public Function PiP(ByVal d1 As Double, ByVal d2 As Double) As Integer
    5. If NKS(d1) >= NKS(d2) Then
    6. Return CInt(Math.Round(CDbl((d2 - d1) * 10 ^ NKS(d1)), 0))
    7. Else
    8. Return CInt(Math.Round(CDbl((d2 - d1) * 10 ^ NKS(d2)), 0))
    9. End If
    10. End Function
    11. MessageBox.Show(PiP(0.101, 0.1009))


    Hätte echt gedacht, das es einfacher ist :D
    In Arbeit...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vico255“ ()

    vico255 schrieb:

    Wenn 17.228 - 17.248 = -0.02 (Ich wollte 2 erhalten aber 20 wäre richtig) Ergo muss ich A-B ^ (Anz Nachkommastellen)
    Das scheint mir mathematisch falsch zu sein.
    Also nach deiner Logik ergibt 17.228 - 17.248 = 20
    Was ist mit 17.2 - 17.0 ? ergibt das 2?

    Aber die Differenz 17.2 - 17.0 ist nunmal in Wirklichkeit das 10-fache der Differenz 17.228 - 17.248 - das kann imo nix werden, wenn da 2 bei rauskommt.

    Halte dich besser an die Mathematik, wie sie ist:
    17.228 - 17.248 = 0.02
    17.228 - 17.028 = 0.2
    und beide Ergebnisse sind Double - nicht Integer.

    vico255 schrieb:

    Wenn 17.228 - 17.248 = -0.02 (Ich wollte 2 erhalten aber 20 wäre richtig) Ergo muss ich A-B ^ (Anz Nachkommastellen)
    Da passt doch was in deinen grundsätzlichen Gedankengängen nicht.
    Was soll denn raus kommen, wenn der Preis von 17.100 auf 17.500 geht? 4, 40, 400?

    Das einzige, was ich mir vorstellen kann, ist, dass du grundsätzlich z.B. ganze Tausendstel sehen willst.
    Also Int(d*1000)

    Ansonsten macht das für mich null Sinn
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    vico255 schrieb:

    400
    Dann würde dein Ansatz schon scheitern, Die Differenz von 17.100 und 17.500 ist 0.4
    Das ist nur eine Nachkommastelle. und dein Ergebnis wäre 4.

    Denk nochmals darüber nach, ob du nicht in Wahrheit die Tausendstel als Ganzzahl sehen willst (s.o.)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @vico255 Willst Du die Preisdifferenz in zehntel Cent?
    Preise MAL Tausend,
    CInt(),
    Differenz,
    feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ich habe nur 3 Typen Double

    0,000
    0,0000
    0,00000

    Ich hab es jetzt so gemacht, das ich vorher prüfe wieviele Nachkommastellen welcher Wert hat und soweit ich das sehe, funktioniert das hier.

    VB.NET-Quellcode

    1. Public Function PiP(ByVal d1 As Double, ByVal d2 As Double, ByVal NKSint As Integer) As Integer
    2. Return CInt((d1 * 10 ^ NKSint) - (d2 * 10 ^ NKSint))
    3. End Function


    Hoffe das wars jetzt. Danke euch
    In Arbeit...