Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.09;
Скачать: CL | DM;

Вниз

Delphi ошибается?   Найти похожие ветки 

 
Peter Sai4in   (2008-09-29 23:59) [0]

Здавствуйте, решаю простую на первый взгляд задачу.
Дано число real нужно округлить с недостатком до тысячных, сотых, десятых.


function rounddown(a,d:real):real;
begin
  result:=trunc(a*d)/d;
end;


a - само число, d - показывает насколько округлять:
 то есть 1000 до тысячных, 100 - сотых и тд

Проблема в том, что для некоторых чисел, например 20,31
вместо ожидаемого
20,31
20,31
20,3
получаю
20,309
20,3
20,3

Это из-за погрешностей вычислений? Как бороться?


 
Amoeba ©   (2008-09-30 00:04) [1]


> Как бороться?

Читать вот это до полного просветления:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374


 
Peter Sai4in   (2008-09-30 00:19) [2]

Спасибо.
Эх, а решение казалось таким простым ))
Наверное, придется в строку число перевести и там уже резать его.


 
Peter Sai4in   (2008-09-30 00:37) [3]

Вот переписал исходный код так


function rounddown(a,d:real):real;
begin
  a:=a*d;
  a:=trunc(a);
  result:=a/d;
end;


и все работает, ну обьясните в чем же тут разница???


 
Германн ©   (2008-09-30 01:10) [4]


> ну обьясните в чем же тут разница

Ну как минимум разница в том, что вся операция в одном случае отдана на откуп компилятору и выполняется по его внутренним правилам. А во втором случае вся операция разбита на куски и в каждом куске на результат влияет смысл статьи АГ. :)


 
Anatoly Podgoretsky ©   (2008-09-30 11:28) [5]

> Peter Sai4in  (30.09.2008 0:19:02)  [2]

Резать самому ничего не надо. FormatFloat


 
Anatoly Podgoretsky ©   (2008-09-30 11:28) [6]

> Peter Sai4in  (30.09.2008 0:37:03)  [3]

Повезло


 
Dimaxx ©   (2008-09-30 19:41) [7]

Либо FormatFloat, либо так, если нужно использовать округленное число для дальнейших вычислений и т.п.

function RoundTo(R: extended; Decimals: integer): extended;
var Factor: extended;
begin
 Factor:=IntPower(10,Decimals);
 Result:=Round(Factor*R)/Factor;
end;


 
Dimaxx ©   (2008-09-30 19:43) [8]

Забыл еще одно. Так прокатит только для типов double и extended... Real и single отпадают.

PS: Тьфу, код практически аналогичен [0]... Чего не бывает после тяжелого дня...


 
Amoeba ©   (2008-09-30 23:17) [9]


> Dimaxx ©   (30.09.08 19:43) [8]
>
> Забыл еще одно. Так прокатит только для типов double и extended.
> .. Real и single отпадают.
>

В Delphi уже давно Real=Double. Пора бы знать ...



Страницы: 1 вся ветка

Текущий архив: 2008.11.09;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.009 c
15-1221213934
Prohodil Mimo
2008-09-12 14:05
2008.11.09
Какой програмный код считается разным? Литература


2-1222860952
Nikefest
2008-10-01 15:35
2008.11.09
Версия проекта


15-1221481634
desc
2008-09-15 16:27
2008.11.09
О открытии сайта


2-1222932887
JohnKorsh
2008-10-02 11:34
2008.11.09
Вопрос по компоненту IdlCmpClient


2-1222673282
JohnKorsh
2008-09-29 11:28
2008.11.09
Вопрос по компонентеам, работающим с сетью.