AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit Trunc

Ein Thema von hhcm · begonnen am 19. Apr 2018 · letzter Beitrag vom 22. Apr 2018
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
hhcm

Registriert seit: 12. Feb 2006
Ort: Wegberg
310 Beiträge
 
Delphi 11 Alexandria
 
#1

Probleme mit Trunc

  Alt 19. Apr 2018, 11:34
Hallo zusammen,

kann mir mal jemand auf die Sprünge helfen?

Delphi-Quellcode:
var
    c: Int64;
    a,b: Double;
begin
  a := 1.71;
  c := Trunc(a*100); // C=170

  a := 1.71;
  b := a*100;
  c := Trunc(b); // C=171
Warum ist der erste versuch falsch?
Chris
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#2

AW: Probleme mit Trunc

  Alt 19. Apr 2018, 11:52
Ich vermute, daß Du mit der 32-Bit-Version rechnest.

Dann ist das erste Ergebnis verständlich, da a*100 als Extended gerechnet wird: Das Zwischenresultat 170.999999999999996 wird dann auf 170 abgeschnitten.

Unter 64-Bit ist das Zwischenresultat 171.000000000000000.

Im Deinem zweiten Fall wird das Zwischenresultat erst nach Double gerundet und in b gespeichet (hat also wie bei 64-Bit den Wert 171.0)
  Mit Zitat antworten Zitat
OLDIE1950

Registriert seit: 2. Jan 2018
22 Beiträge
 
#3

AW: Probleme mit Trunc

  Alt 19. Apr 2018, 12:10
In Delphi konvertiert Trunc eine Gleitkommazahl in einen Integer-Wert.
X ist ein Ausdruck des Typs Real.
Trunc gibt einen Int64-Wert mit dem gegen 0 gerundeten Wert von X zurück.
http://docwiki.embarcadero.com/Libra...e/System.Trunc
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#4

AW: Probleme mit Trunc

  Alt 19. Apr 2018, 12:17
In Delphi konvertiert Trunc eine Gleitkommazahl in einen Integer-Wert.
X ist ein Ausdruck des Typs Real.
Das erklärt das Problem nicht! Das Wesentliche ist, daß X extended ist bei trunc(a*100).
  Mit Zitat antworten Zitat
hhcm

Registriert seit: 12. Feb 2006
Ort: Wegberg
310 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Probleme mit Trunc

  Alt 19. Apr 2018, 12:17
Ok, das hab ich soweit verstanden.
Trotzdem stehe ich jetzt noch dümmer da als vorher
Heute ist einfach nicht mein Tag.

Ich möchte eigentlich nur einen Eurowert in Cent umrechnen und das möglichst ohne Rundungsfehler
Tatsächlich wird mit 32Bit kompiliert.
Chris
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#6

AW: Probleme mit Trunc

  Alt 19. Apr 2018, 12:31
Dann rechne komplett 64-Bit-Integer oder mit Currency (<- dazu kann ich Dir aber nicht mehr sagen, siehe zB http://docwiki.embarcadero.com/Libra...ystem.Currency oder https://stackoverflow.com/questions/...ing-a-currency).

Oder wenn Du manuell wie oben mit 100 multiplizierst, sollte auch round statt trunc weiterhelfen.

Geändert von gammatester (19. Apr 2018 um 12:38 Uhr)
  Mit Zitat antworten Zitat
hhcm

Registriert seit: 12. Feb 2006
Ort: Wegberg
310 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Probleme mit Trunc

  Alt 19. Apr 2018, 12:39
Ich bekomme durchgezogen durch die ganze Anwendung ein Double mit dem Wert.
Würde es denn unter gewissen umständen Probleme machen wenn ich den zweiten Weg einfach nutzen würde?
Chris
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Probleme mit Trunc

  Alt 19. Apr 2018, 12:56
Würde es denn unter gewissen umständen Probleme machen wenn ich den zweiten Weg einfach nutzen würde?
Ich behaupte, das ist sogar eher, was du willst (round). Statt abzuschneiden wird hier an den näheren Wert gerundet. Also praktisch kaufmännisches Runden, wie man es aus der Schule kennt < 0.5 -> Abrunden , > 0.5 -> Aufrunden .
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (19. Apr 2018 um 13:05 Uhr)
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#9

AW: Probleme mit Trunc

  Alt 19. Apr 2018, 12:58
Ich bekomme durchgezogen durch die ganze Anwendung ein Double mit dem Wert.
Würde es denn unter gewissen umständen Probleme machen wenn ich den zweiten Weg einfach nutzen würde?
Mit Deinem Code hast Du dann für andere Werte die Probleme, zB für a=1.13.

Mit round sollte es funktionieren.
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#10

AW: Probleme mit Trunc

  Alt 19. Apr 2018, 13:02
Ich möchte eigentlich nur einen Eurowert in Cent umrechnen und das möglichst ohne Rundungsfehler
Dann nimm doch einfach Round statt Trunc. Dann sollte auch Round(a*100) funktionieren.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz