Форум: "Начинающим";
Текущий архив: 2008.11.09;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c