Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
3-1209121091
Int23
2008-04-25 14:58
2008.11.09
Как вызвать окно выдора доступных MS SQL Server ов


2-1222836281
AlekseyB
2008-10-01 08:44
2008.11.09
CheckListBox


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


2-1222873726
Толик
2008-10-01 19:08
2008.11.09
Сохранение настроек в ini файл


2-1222794081
Petr
2008-09-30 21:01
2008.11.09
О смене пользователя





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский