Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Kaufmännische Runden geht nicht ! (https://www.delphipraxis.net/178926-kaufmaennische-runden-geht-nicht.html)

Davidlocke13 4. Feb 2014 11:07

Kaufmännische Runden geht nicht !
 
Hallo,
ich will Kaufmännische Runden auf 2 Nachkommastellen!

Dafür habe ich folgendes Programm gebastelt:

Delphi-Quellcode:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math;

type
  TForm3 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Button2: TButton;
    Edit3: TEdit;
    Edit4: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

function RoundUp(X: double): double;
begin
   Result := Trunc(X) + Trunc (Frac(X) * 2);
end;

function RoundX(const Value:double; const NK:Integer):double;
var
   multi: double;
begin
   multi := IntPower(10, NK);
   Result := RoundUp(Value*multi) / multi;
end;


procedure TForm3.Button1Click(Sender: TObject);
var
  x: Double;
begin
  x := StrToFloat(Edit1.Text);
  Edit2.Text := FloatToStr(RoundX(x, 2));
end;

procedure TForm3.Button2Click(Sender: TObject);
var
  Y: Double;
begin
  Y:= StrToFloat(Edit3.Text);
  Edit4.Text:= FloatToStr(Round(Y));
end;

end.
Ergebnisse der Rundung die ich bekomme:

16,5556 --> 16,56 Ergebnis stimmt !
16,56455 --> 16,56 was raus kommen sollte: 16,57
16,121313 --> 16,12 was raus kommen sollte: 16,13

Also wenn die Zahlen am Ende kleiner als 5 sind wird nicht aufgerundet!
Was muss ich ändere damit ich das gewünschte Ergebnis bekomme?

Liebe Grüße

Davidlocke13 4. Feb 2014 11:10

AW: Kaufmännische Runden geht nicht !
 
Sorry der Teil ist was Extra, sollte nicht dazu gehören:
Delphi-Quellcode:
procedure TForm3.Button2Click(Sender: TObject);
var
  Y: Double;
begin
  Y:= StrToFloat(Edit3.Text);
  Edit4.Text:= FloatToStr(Round(Y));
end;

Mikkey 4. Feb 2014 11:16

AW: Kaufmännische Runden geht nicht !
 
Was Du willst, ist offenbar nicht "kaufmännisches Runden", sondern immer aufrunden?

Dann sollte Roundup so aussehen:

Delphi-Quellcode:
function RoundUp(X: double): double;
begin
   Result := Trunc(X);
   if Frac(X) <> 0 then
     Result := Result + 1;
end;

fkerber 4. Feb 2014 11:16

AW: Kaufmännische Runden geht nicht !
 
Hi,

für mich sieht das alles korrekt nach kaufmännischem Runden aus.
Willst du vielleicht immer aufrunden?

Bei welchem Zahlen sollte bei dir denn abgerundet werden?


Viele Grüße,
Frederic

Davidlocke13 4. Feb 2014 11:21

AW: Kaufmännische Runden geht nicht !
 
Ich will immer aufrunden, was im übrigen Kaufmännisch am besten ist !

Mach ja keine sinn sinn wenn ich 16,3211 auf 16,32 runde, da mache ich 0,0011 Cent Verlust !

fkerber 4. Feb 2014 11:25

AW: Kaufmännische Runden geht nicht !
 
http://de.wikipedia.org/wiki/Rundung...nisches_Runden

Viele Grüße,
Frederic

Davidlocke13 4. Feb 2014 11:27

AW: Kaufmännische Runden geht nicht !
 
Oh dachte das ist Arithmetisch Runden !

Kaufmännische ist dann wohl doch nicht so gut wenn ich Preise berechnen will ;-)

Klaus01 4. Feb 2014 11:30

AW: Kaufmännische Runden geht nicht !
 
Vielleicht tut es das:
Delphi-Quellcode:
kein_bankers_round := ceil(value * 100)/100;
ceil

Grüße
Klaus

Davidlocke13 4. Feb 2014 11:40

AW: Kaufmännische Runden geht nicht !
 
Danke mit der Funktion geht es ;-)

Delphi-Quellcode:
function RoundUp(X: double): double;
begin
   Result := Trunc(X);
   if Frac(X) <> 0 then
     Result := Result + 1;

gammatester 4. Feb 2014 13:00

AW: Kaufmännische Runden geht nicht !
 
Zitat:

Zitat von Davidlocke13 (Beitrag 1246597)
Danke mit der Funktion geht es ;-)

Delphi-Quellcode:
function RoundUp(X: double): double;
begin
   Result := Trunc(X);
   if Frac(X) <> 0 then
     Result := Result + 1;

Wirklich? Finde ich eigentlich nicht: roundx(-11.555,2) ergibt damit -11.54 statt -11.56.

Furtbichler 4. Feb 2014 15:55

AW: Kaufmännische Runden geht nicht !
 
Zitat:

Zitat von Klaus01 (Beitrag 1246596)
Vielleicht tut es das:
Delphi-Quellcode:
bankers_round := ceil(value * 100)/100;
ceil

Das hat jetzt nichts mit 'bankers rounding' zu tun.

hoika 4. Feb 2014 16:08

AW: Kaufmännische Runden geht nicht !
 
Hallo,

es gab vor etwa einem Jahr mal nen Thread dazu,
nachdem keine der Funktionen so richtig funktioniert hatte,
habe ich mir was eigenes gebaut, was auf String-Handling basiert,
also mit Nullen auf 3 Kommastellen auffüllen,
3. Stelle nach Null prüfen, wenn >=5 aufrunden, sonst abrunden ...

Danach das Komma entfernen und ich habe sofort meine EuroCent als Integer.


Heiko

Furtbichler 4. Feb 2014 19:23

AW: Kaufmännische Runden geht nicht !
 
Zitat:

Zitat von hoika (Beitrag 1246637)
...es gab vor etwa einem Jahr mal nen Thread dazu,
nachdem keine der Funktionen so richtig funktioniert hatte,
habe ich mir was eigenes gebaut, was auf String-Handling basiert,
also mit Nullen auf 3 Kommastellen auffüllen,
3. Stelle nach Null prüfen, wenn >=5 aufrunden, sonst abrunden ...

Danach das Komma entfernen und ich habe sofort meine EuroCent als Integer.

Das ist jetzt so ziemlich genau 2 Monate her. Aber bitte, nicht diese Art der 'Problem-nicht-verstanden-also-hol-ich-den-Holzhammer'-Problemlösung. Ich befürchte, Du bekommst mit normalen Rundungsfehlern der Double-Werte auch Probleme, aber das soll hier nicht Thema sein.

Die Lösung für dein Rundungsproblem heißt 'Round'. Und wenn man gaanz genau sein will, addiert man noch 0.5x die geforderte Genauigkeit hinzu, bevor man rundet.

Mit Fließkommazahlen und Runden zu arbeiten, ist total simpel. Man muss einfach nur einmal verstehen, was dahinter steckt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16: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-2025 by Thomas Breitkreuz