![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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, что получится - бесконечная дробь, точного результата никогда не получишь, только приближённый.
|
|
#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 не устраивает?
|
| Этот пользователь сказал Спасибо 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;![]() красная строчка тебе в помощь! |