AGB  ·  Datenschutz  ·  Impressum  







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

Unterschiedliche Ergebnisse beim Runden

Ein Thema von Ritsch · begonnen am 14. Aug 2017 · letzter Beitrag vom 21. Aug 2017
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.609 Beiträge
 
Delphi 12 Athens
 
#1

AW: Unterschiedliche Ergebnisse beim Runden

  Alt 16. Aug 2017, 10:53
In den Screenshots konnte man sehen, dass Multi den Wert 10 und Zahl den Wert 0.075 hatte, wobei interessant gewesen wäre, wie der Wert 0.075 entstanden war.
Das ist nicht ganz richtig: In dem ScreenShot aus #1 hat Multi den Wert 100. Andernfalls wäre ja auch nicht 7,5 das erwartete Ergebnis.

Ansonsten hast du natürlich recht mit der internen Darstellung.

Das folgende Beispielprogramm demonstriert das (zumindest unter Win32):

Delphi-Quellcode:
program Project262;

{$APPTYPE CONSOLE}

var
  MultiS: Single;
  WertS: Single;
  MultiD: Double;
  WertD: Double;
begin
  MultiS := 100;
  MultiD := 100;
  WertS := 0.075;
  WertD := 0.075;
  Writeln('Single: ', Round(MultiS * WertS));
  Writeln('Double: ', Round(MultiD * WertD));
  Readln;
end.
Es lässt sich aber auch zeigen, daß die Verwendung der von mir vorgeschlagenen Unit das Problem löst:

Delphi-Quellcode:
program Project263;

{$APPTYPE CONSOLE}

uses
  DecimalRounding_JH1;

var
  MultiS: Single;
  WertS: Single;
  MultiD: Double;
  WertD: Double;
begin
  MultiS := 100;
  MultiD := 100;
  WertS := 0.075;
  WertD := 0.075;
  Writeln('Single: ', Round(MultiS * WertS));
  Writeln('Double: ', Round(MultiD * WertD));
  Writeln('Single JH: ', DecimalRoundSgl(MultiS * WertS, 0));
  Writeln('Double JH: ', DecimalRoundDbl(MultiD * WertD, 0));
  Readln;
end.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.087 Beiträge
 
Delphi XE2 Professional
 
#2

AW: Unterschiedliche Ergebnisse beim Runden

  Alt 16. Aug 2017, 12:16
@Uwe,
Oh, das ist mir jetzt aber peinlich.
Na klar war Multi=100 gesetzt.
Ich hab noch mal die Tabelle auf Basis Multi=100 erstellt.

CPU interne Darstellung von X=0.075, wobei X den jeweils angegebenen Typ hat:
Single 0.07500000298023223880 00 00 00 00 00 9A 99 99 FB 3F
Real48 0.07500000000004547470 00 00 00 9A 99 99 99 99 FB 3F
Double 0.07499999999999999720 00 98 99 99 99 99 99 99 FB 3F
Extended 0.07500000000000000000 9A 99 99 99 99 99 99 99 FB 3F

CPU interne Darstellung von 100 * X=0.075, wobei X den jeweils angegebenen Typ hat:
Single 7.50000029802322388000 00 00 00 00 A0 00 00 F0 01 40
Real48 7.50000000000454747000 00 00 A0 00 00 00 00 F0 01 40
Double 7.49999999999999972000 80 FD FF FF FF FF FF EF 01 40
Extended 7.50000000000000000000 01 00 00 00 00 00 00 F0 01 40
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz