Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Умножение и деление чисел с плавающей точкой


Автор: ACMilian 26.9.2007, 12:52
Привет всем.
Туплюсь что-та. Как в Дэлфи умножать и делить очень маленькие десятичные числа?
Например 0.015 * 0.00031 /  0.05 ?

Автор: Rennigth 26.9.2007, 13:10
Цитата(ACMilian @  26.9.2007,  12:52 Найти цитируемый пост)
0.015 * 0.00031 /  0.05

так и делить... в чем проблема?

Автор: Alix 26.9.2007, 13:16
У тебя теряются знаки после запятой? Используй тип Double или Extended.

Цитата
десятичные числа

я так понял имелись в виду действительные? (aka вещественные)

Автор: Alexeis 26.9.2007, 13:25
Extended сохраняет 19 значащих цифр, т.е. число типа 0,0000000000000000000000000000000000000000000000000000000000000000001234567890123456789 нормально храниться умножается делиться и т.д.

Автор: Guedda 26.9.2007, 13:40
А если у тебя проблемы именно с плавающей точкой, используй SetDelimiter

Автор: ACMilian 26.9.2007, 14:11
вот пример:
Код

procedureTfmMain.queryCalcFields(DataSet: TDataSet);
Var
 a,b,c,d : Extended;
begin
a := queryRas_Fakt.Value;  // 0.015
b := queryNorm.Value; // 0.00031
c := queryRes_Plan.Value; 0.05
d := (a * b) / c; 
end;


вот в d какая то фигня хранится.

Автор: Guedda 26.9.2007, 14:19
У меня все нормально выводится, 0,000093. А у тебя что?
Пользовался этим кодом:
Код

var
  a,b,c,d: Extended;
begin
  a := 0.015;
  b := 0.00031;
  c := 0.05;
  d := (a * b) / c;
  ShowMessage(FloatToStr(d));
end;

Автор: ACMilian 26.9.2007, 14:40
Цитата(Guedda @  26.9.2007,  14:19 Найти цитируемый пост)
Пользовался этим кодом:

код Pascal/Delphi
var
  a,b,c,d: Extended;
begin
  a := 0.015;
  b := 0.00031;
  c := 0.05;
  d := (a * b) / c;
  ShowMessage(FloatToStr(d));
end;



а у меня ответ равен:  9.3E-5..
не понимаю.

Автор: Guedda 26.9.2007, 15:02
Значит используй http://www.delphisources.ru/pages/faq/faq_delphi_basics/FloatToStrF.php.html

Добавлено через 12 секунд
Ты просто неотформатированно делаешь вывод

Добавлено через 5 минут и 21 секунду
Код

var
  a,b,c,d: Extended;
begin
  a := 0.015;
  b := 0.00031;
  c := 0.05;
  d := (a * b) / c;
  ShowMessage(FloatToStrF(d, ffGeneral, 8,8));
end;

Автор: ACMilian 26.9.2007, 15:29
а как мне засунуть это число в поле датасэта? 
чтоб оно там правильно отображалось?

Автор: Alexeis 26.9.2007, 15:51
Цитата(ACMilian @  26.9.2007,  15:29 Найти цитируемый пост)
а как мне засунуть это число в поле датасэта? 
чтоб оно там правильно отображалось? 

  Например в виде отформатированной строки, полученной FloatToStrF, как это показал Guedda.

Автор: Esperito 26.9.2007, 15:52
Это зависит от твоих настроек отображения поля. А присваиваться оно будет нормально, т.к. это просто такая научная форма записи числа.

Автор: ACMilian 26.9.2007, 16:01
ну к ,примеру, если я делаю так:
Код

q.FieldByName('Udel').AsString := FloaToStrF(q.FieldByName('R_Fakt').AsFloat * q.FieldByName('Norma').AsFloat / q.FieldByName('R_Plan').AsFloat, ffGeneral, 8, 8);


то в q.FieldByName('Udel').AsString заноситсо неправильное представление. а как по другому? 

Автор: Guedda 26.9.2007, 16:55
Цитата(ACMilian @  26.9.2007,  17:01 Найти цитируемый пост)
 заноситсо неправильное представление

Покажи, какое именно неправильное представление заносится?

Автор: ACMilian 26.9.2007, 17:04
вот такое: 9.3E-5..

Автор: Guedda 26.9.2007, 17:10
Ты читал ссылку, которую я тебе выше написал??? Изучай!

Автор: ACMilian 26.9.2007, 17:16
Цитата(ACMilian @  26.9.2007,  16:01 Найти цитируемый пост)
q.FieldByName('Udel').AsString := FloaToStrF(q.FieldByName('R_Fakt').AsFloat * q.FieldByName('Norma').AsFloat / q.FieldByName('R_Plan').AsFloat, ffGeneral, 8, 8);


ну так я так пишу? разве не верно? 

Автор: Alexeis 26.9.2007, 18:02
ACMilian, попробуй поэтапно, сначала вычислять, потом сковертировать в строку, затем в базу, может так легче ошибка найдется?

Добавлено через 1 минуту и 26 секунд
  Код написан правильно, осталось проверить значения.

Автор: ACMilian 26.9.2007, 18:34
такой код заносит не то представление чмсла:
Код

q.FieldByName('Udel').AsString := FloaToStrF(q.FieldByName('R_Fakt').AsFloat * q.FieldByName('Norma').AsFloat / q.FieldByName('R_Plan').AsFloat, ffGeneral, 8, 8);

в q.FieldByName('R_Fakt').AsFloat находится значение - 0.015
в q.FieldByName('Norma').AsFloat  - 0.00031
в q.FieldByName('R_Plan').AsFloat - 0.05
если вношу результат этих действий в переменную строкового типа вот так:
Код

var
 stroka : String;
begin
stoka := FloaToStrF(q.FieldByName('R_Fakt').AsFloat * q.FieldByName('Norma').AsFloat / q.FieldByName('R_Plan').AsFloat, ffGeneral, 8, 8);
end;

то в строке находитсо правильное представление числа т.е. 0.000093
но если я пытаюсь присвоить это значение в датасэт таким образом:
Код

q.FieldByName('Udel').AsString := stroka;


то туда заносится неправильное ппредставление числа...
где я ошибаюсь?

Автор: Alix 26.9.2007, 20:31
Не гарантирую, что то, что я скажу верно, я лишь посмотрел по хелпу, а с БД я почти не работал.
Как я понимаю делая field.AsString := number ты присваиваешь полю значение, которое потом (ведь это поле TFloatField, да?), с помощью, наверное, StrToFloat переводится в число с плавающей точкой и так в поле и хранится. А форматирование для вывода на экран надо задавать через TFloatField.DisplayFormat. Формат маски см. в хелпе.  Заодно обрати внимание на TFloatField.EditFormat

Автор: Esperito 28.9.2007, 20:53
А не проще сделать так?
Код

q.FieldByName('Udel').AsFloat := q.FieldByName('R_Fakt').AsFloat * q.FieldByName('Norma').AsFloat / q.FieldByName('R_Plan').AsFloat;

Это, разумеется, при условии, что Udel - число.
А если нет, тогда вот так:
Код

q.FieldByName('Udel').AsString := FloaToStrF(q.FieldByName('R_Fakt').AsFloat * q.FieldByName('Norma').AsFloat / q.FieldByName('R_Plan').AsFloat, ffFixed, 8, 8);

Это должно сработать smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)