Gdzie problem w zaokrągleniu?

Gdzie problem w zaokrągleniu?
0

Witam, gdzie problem w zaokrągleniu:

Kopiuj
 Edit3.Text := FloatToStr(RoundTo((StrToFloat(Edit1.Text) / StrToFloat(Edit2.Text)),-2));

Chciałbym żeby zaokrąglało zgodnie z zasadami matematyki, czyli jak jest np. 0,455 to po zaokrągleniu ma być 0,46. Jak jest 0,454 to powinno być 0,45.

Jak to zrobić, gdzie robię błąd?

Dzięki

puchi
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 3 lata
  • Postów:411
0

Powinno być tak:

Kopiuj
Var
Liczba1, Liczba2: Currency;
begin
Liczba1:= StrToFloat(Edit1.Text);
Liczba2:= StrToFloat(Edit2.Text);
Edit3.Text:= FloatToStr(Round(Liczba1/Liczba2));
0

Niestety coś nie bardzo... :-(

AP
  • Rejestracja:około 22 lata
  • Ostatnio:ponad 12 lat
  • Postów:3079
0

Przy używaniu funkcji do zaokrąglania sprawdź czy masz dobrze ustawiony SetRoundMode bo inaczej wyniki mogą odbiegać od zamierzeń.

0

A jak to sprawdzić?

AP
  • Rejestracja:około 22 lata
  • Ostatnio:ponad 12 lat
  • Postów:3079
0

Gdybym tylko odpowiadał na pytania to bym odpowiedział GetRoundMode ale pewnie nie o to Ci chodzi. Na przyszłość nie zadawaj głupich pytań.

Ustaw po prostu taki tryb wg jakiego ma to zaokrąglać. Napisz sobie w kompilatorze SetRoundMode i naciśnij F1. W helpie masz napisane czarno na białym jakie są rodzaje zaokrąglania i co trzeba wpisać, żeby działało tak jak chcesz :O

Jeżeli nie znasz angielskiego to sprawdź doświadczalnie, masz aż 4 możliwości ustawienia tego parametru...

0

ok, sorry i dzięki

crowa
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Poznań
  • Postów:295
0
Kopiuj
function RoundFloatCurr(C: Currency): Currency;
var
  n: Currency;
  x: Word;
  function IntPower_(x, y: Integer): Int64;
  begin
    Result := 1;
    while y > 0 do
    begin
      while not Odd(y) do
      begin
        y := y shr 1;
        x := x * x;
      end;
      Dec(y);
      Result := Result * x;
    end;
  end;
begin
  n := IntPower_(10, CurrencyDecimals);
  x := Default8087CW;
  Set8087CW((Default8087CW or $800) and $FBFF);
  if C < 0 then
    Result := Trunc(C * n - 0.5) / n
  else
    Result := Trunc(C * n + 0.5) / n;
  Set8087CW(x);
end;

i robisz sobie tak

Kopiuj
z := strtofloat(a)/strtofloat(b);

z := RoundFloatCurr(z)

bo zapewne chodzi Ci o zaokraglenia walutowe


Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance
AP
  • Rejestracja:około 22 lata
  • Ostatnio:ponad 12 lat
  • Postów:3079
0

@crowa - a nie można po prostu ustawić sposobu zaokrąglania SetRoundMode? Przecież Delphi obsługuje wszystkie rodzaje zaokrągleń...

crowa
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 8 lat
  • Lokalizacja:Poznań
  • Postów:295
0

generalnie tak ;-) chyba ze masz Delphi2006 to w przypadku kochanych zlotoweczek sie wszystko rozjerzdza jesli nie ustawisz trybu kooperatora


Tomasz Andrzejewski
Delphi (XE3-XE7) framework engineer @ InterLan
MCP: Microsoft SQL Server 2008, Implementation and Maintenance
axel234
  • Rejestracja:prawie 18 lat
  • Ostatnio:5 dni
0
Kopiuj
edit3.text:=floattostr(RoundTo(strtofloat(edit3.text), -2));
edit3.text:=FormatFloat(',0.00',strtofloat(edit3.text));

To cię powinno naprowadzić...

pozdr

edytowany 1x, ostatnio: axel234

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.