Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Умножение и деление чисел с плавающей точкой 
:(
    Опции темы
ACMilian
Дата 26.9.2007, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 5.9.2006
Где: Беларусь

Репутация: нет
Всего: нет



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

PM MAIL ICQ   Вверх
Rennigth
Дата 26.9.2007, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



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

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



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Alix
Дата 26.9.2007, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 8
Всего: 23



У тебя теряются знаки после запятой? Используй тип Double или Extended.

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

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


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 26.9.2007, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Guedda
Дата 26.9.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 1
Всего: 78



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


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
ACMilian
Дата 26.9.2007, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 5.9.2006
Где: Беларусь

Репутация: нет
Всего: нет



вот пример:
Код

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 какая то фигня хранится.
PM MAIL ICQ   Вверх
Guedda
Дата 26.9.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 1
Всего: 78



У меня все нормально выводится, 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;



--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
ACMilian
Дата 26.9.2007, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 5.9.2006
Где: Беларусь

Репутация: нет
Всего: нет



Цитата(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..
не понимаю.

Это сообщение отредактировал(а) ACMilian - 26.9.2007, 14:40
PM MAIL ICQ   Вверх
Guedda
Дата 26.9.2007, 15:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 1
Всего: 78



Значит используй FloatToStrF

Добавлено через 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;



--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
ACMilian
Дата 26.9.2007, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 5.9.2006
Где: Беларусь

Репутация: нет
Всего: нет



а как мне засунуть это число в поле датасэта? 
чтоб оно там правильно отображалось?
PM MAIL ICQ   Вверх
Alexeis
Дата 26.9.2007, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



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

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Esperito
Дата 26.9.2007, 15:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 2.9.2007

Репутация: нет
Всего: 3



Это зависит от твоих настроек отображения поля. А присваиваться оно будет нормально, т.к. это просто такая научная форма записи числа.
PM MAIL   Вверх
ACMilian
Дата 26.9.2007, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 5.9.2006
Где: Беларусь

Репутация: нет
Всего: нет



ну к ,примеру, если я делаю так:
Код

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 заноситсо неправильное представление. а как по другому? 
PM MAIL ICQ   Вверх
Guedda
Дата 26.9.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 1
Всего: 78



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

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


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
ACMilian
Дата 26.9.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 5.9.2006
Где: Беларусь

Репутация: нет
Всего: нет



вот такое: 9.3E-5..

PM MAIL ICQ   Вверх
Guedda
Дата 26.9.2007, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 1
Всего: 78



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


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
ACMilian
Дата 26.9.2007, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 5.9.2006
Где: Беларусь

Репутация: нет
Всего: нет



Цитата(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);


ну так я так пишу? разве не верно? 
PM MAIL ICQ   Вверх
Alexeis
Дата 26.9.2007, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



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

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ACMilian
Дата 26.9.2007, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 5.9.2006
Где: Беларусь

Репутация: нет
Всего: нет



такой код заносит не то представление чмсла:
Код

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;


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

Это сообщение отредактировал(а) ACMilian - 26.9.2007, 18:35
PM MAIL ICQ   Вверх
Alix
Дата 26.9.2007, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 8
Всего: 23



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

Это сообщение отредактировал(а) Alix - 26.9.2007, 20:37


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Esperito
Дата 28.9.2007, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 2.9.2007

Репутация: нет
Всего: 3



А не проще сделать так?
Код

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
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1325 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.