![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; a,b,c: double; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin a := 212.53; b := 212.49; c := a - b; showmessage(floattostr(c)); end; end. Последний раз редактировалось Admin, 15.08.2011 в 10:41. |
#2
|
||||
|
||||
![]() Код:
a,b,c: Currency; Пишу программы за еду. __________________ |
#3
|
||||
|
||||
![]() Спасибо конешно за вариант, но а если "а" будет равно 212.4556565, а "b" будет равно 212.343676676?
|
#4
|
||||
|
||||
![]() Т.о. результатом "a-b" будет 0.111979824000002, а нужно 0.111979824.
|
#5
|
||||
|
||||
![]() Непонятно, то ты округляешь до 0,04 (3-го знака), то до 0.111979824 (9-го знака). Тогда уж или 0.039999999 или 0.112.
Напиши свою функцию округления и не парься. В начале был Бит, потом Байт и только потом появилось Слово... |
#6
|
||||
|
||||
![]() подразумевается что под "a" и "b" могут быть любые числа, а результат операции должен быть правильным... Для этого я должен написать свою функцию, а Delphi этого не предоставляет?
|
#7
|
||||
|
||||
![]() Это не Дельфи предоставляет, это суть вещественных чисел как их представляет процессор. Попробуй взять 1/3, что получится - бесконечная дробь, точного результата никогда не получишь, только приближённый.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#8
|
||||
|
||||
![]() Есть готовая функция
Код:
function RoundEx(chislo: double; Precision: Integer): string; var ChisloInStr: string; ChisloInCurr: currency; begin ChisloInCurr := chislo; Str(ChisloInCurr: 20: Precision, ChisloInStr); ChisloInStr[Pos('.', ChisloInStr)] := ','; RoundEx := Trim(ChisloInStr); end; procedure TForm1.Button1Click(Sender: TObject); begin Edit1.Text := RoundEx(StrToFloat(Edit1.Text), 2); end; ну или тут http://www.delphisources.ru/pages/fa...d_numbers.html В начале был Бит, потом Байт и только потом появилось Слово... |
#9
|
||||
|
||||
![]() да, я в курсе что вещественные числа проблемно хранить в памяти сегодняшних компьютеров и операции осуществляются с неверным результатом...
Как я понимаю в Delphi отсутствует функция округления до необходимой цифры дробной части числа? |
#10
|
||||
|
||||
![]() Мне такая неизвестна
Если посмотреть библиотеки делфи, то они все состоят из подобных функций, написанных на том же паскале порой с использованием винапи или ассемблера. Что стоит воткнуть свою... В начале был Бит, потом Байт и только потом появилось Слово... |
#11
|
||||
|
||||
![]() Чем RoundTo, SimpleRoundTo не устраивает?
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
SpectraL (19.02.2015)
|
#12
|
||||
|
||||
![]() Цитата:
|
#13
|
||||
|
||||
![]() Цитата:
|
#14
|
||||
|
||||
![]() Результатом операции "a-b" является тип extended. При преобразовании типа extended в тип double ("c := a - b;") получаются такие неверные результаты. Поэтому лучшим решением нахожу сделать переменные "a, b и c" типом extended:
Цитата:
Цитата:
Цитата:
Цитата:
Последний раз редактировалось SpectraL, 14.08.2011 в 17:57. |
#15
|
||||
|
||||
![]() SpectraL, так еще прикольней:
Код:
var a, b, c: Extended; begin a:=212.53; b:=212.49; c:=a-b; Edit1.Text:=FloatToStr(c); Edit2.Text:=FloatToStr(0.04-c); if Abs(c-0.04)<1E-9 then ShowMessage('c=0.04'); end; ![]() красная строчка тебе в помощь! Пишу программы за еду. __________________ |