Zaokraglenie dla 0.5

0

Witam.

Jak uzyskac efekt RoundTo, badz tez Format, ale zeby dla wartosci 0.5 zwrocilo 0 ?

Dla wartosci 1.6 = 2
Dla wartosci 1.4 = 1
Dla wartosci 1.5 = 1
Dla wartosci 1.501 = 2

Oczywiscie Round zwykly odpada, bo ma to byc dla dowolnej liczb miejsc po przecinku.

Przeczy to zasadom matematyki, ale potrzebuje ten efekt.

0

warunek:
(liczba mod 1) > 0.5 zaokrąglenie w górę
w przeciwnym wypadku zaokrąglenie w dół

0

Chyba najprościej będzie użyć FormatFloat FormatFloat

var
  S : string;
begin
  S := FormatFloat('0', 1.6) +#13#10+
  FormatFloat('0', 1.4) +#13#10+
  FormatFloat('0', 1.5) +#13#10+
  FormatFloat('0', 1.501);
  ShowMessage(S);
end;

Ten kod daje takie wyniki jak chciałeś.

0
Writeln('Trunc: ', Trunc(2.9)); // zwróci 2
Writeln('Floor: ', Floor(2.9)); // zwróci 2
Writeln('Round: ', Round(2.9)); // zwróci 3 

tak sprawa wyglada, jednak jesli ma tylko dla 0.5 zaokrąglać w dół to na zasadzie
1)zamien liczbe na łancuch IntToStr
2) znajdz '.' pos('.', łancuch)
3) sprawdz czy kolejna wartość 5 IF & copy
4a) tak, pobierz liczbe przed przecinkiem i w dół
4b) nie, wykonaj funkcje zaokrąglającą (w zaleznosci od potrzeb np Round)

0

:|

adydan napisał(a)
Writeln('Trunc: ', Trunc(2.9)); // zwróci 2
Writeln('Floor: ', Floor(2.9)); // zwróci 2
Writeln('Round: ', Round(2.9)); // zwróci 3 

tak sprawa wyglada, jednak jesli ma tylko dla 0.5 zaokrąglać w dół to na zasadzie
1)zamien liczbe na łancuch IntToStr
2) znajdz '.' pos('.', łancuch)
3) sprawdz czy kolejna wartość 5 IF & copy
4a) tak, pobierz liczbe przed przecinkiem i w dół
4b) nie, wykonaj funkcje zaokrąglającą (w zaleznosci od potrzeb np Round)

a to nie jest troche bez sensu?
inttostr, pos....? to w takim razie trzeba jeszcze uwzglednic, ze w zaleznosci od ustawien regionalnych raz bedzie kropka, raz przecinek...

0

Dobra, nie poćcie się :-)
@olesio, wyniki sie nie zgadzaly.

Przegadalem 'gorze', ze to wbrew matematyce i moge zaokraglac 'po ludzku' :-P

1 użytkowników online, w tym zalogowanych: 0, gości: 1