Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка округления ADO 
:(
    Опции темы
stmamont
Дата 29.4.2007, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



база данных хранит число типа real
например 123.1

если я делаю запрос (через адо конечно же),

а потом
double t = mQuery->FieldByName("limit1")->AsFloat;
то в t лежит что то типа 123.99992234532
Как мне сделать что бы отображалось нормально?

В DataGrid таже самая проблема.

Очень нужно решение этой мини проблемки)


--------------------
user posted image
PM MAIL ICQ   Вверх
Klin
Дата 29.4.2007, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ИМХО компьютер не хранит число 4, он хранит, что-то типа 3,99987


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
stmamont
Дата 29.4.2007, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



когда делаю запрос через phpPgSql - все так и есть как записал т.е. 123.1
а когда отображаю инфу через ADO , то получается такой бред.
как мне отображать нормально, т.е. 123.1?


--------------------
user posted image
PM MAIL ICQ   Вверх
codelord
Дата 29.4.2007, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

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



вот накидал функцию,
 
Код

#include <iostream>
#include <math.h>
using namespace std;
double round( double val, int dem  ) {   // 4.99 49.9
 val *= pow( 10, dem );
 val = floor( val + 0.5 );
 val /= pow( 10, dem );
 return val;
}
 int main( int argc, char **argv )
{
 double m = 4.9856;
 cout << round( m, 0 ) << endl;    //4.9856 5.0
 cout << round( m, 2 ) << endl;    //4.9856 4.99
 cout << round( m, 3 ) << endl;    //4.9856 4.986

 m = 123.99992234532;
 cout << round( m, 2 ) << endl; // 123.99992234532 124.00;
 m = 123.099992234532;
 cout << round( m, 2 ) << endl; // 123.099992234532 123.1;
 return 0; 
}
 может поможет

Это сообщение отредактировал(а) codelord - 29.4.2007, 21:59


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Vyacheslav
Дата 29.4.2007, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(stmamont @  29.4.2007,  20:00 Найти цитируемый пост)
В DataGrid таже самая проблема.

Это ошибка не гриде, а в голове, когда полагают, что предствление числа в бинарном виде и форма вывода числа - это одно и то же.
Цитата(codelord @  29.4.2007,  21:40 Найти цитируемый пост)
вот накидал функцию,

И для чего?
Конкретная задача должна иметь конкретное и простое решение. 
Посказка.
1. Для TQuery можно создать колекцию требуемых TField  в дизайне. Кстати , профессионалы именно так обычно и делают. А для Field можно задать требуемый форма вывода: например фиксированный  с двумя цифрами после  запятой. 


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
stmamont
Дата 29.4.2007, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



codelord, для округления числа есть функция RoundTo из Math.hpp
Vyacheslav, да понимаю я что проблемы не в хранении числа, а в выводе,
у меня и TQuery создается во время выполнения программы...
как задать постоянный формат для Fields сразу после кода, где создается TQuery?
?
я попробовал сделать так:
Код

    if(Sender)
    {
        TField *field = new TFloatField(monthsPlanQuery);
        dynamic_cast<TFloatField *>(field)->Precision = -2;
        field->Name = "planed";
        monthsPlanQuery->Fields->Add(field);

        field = new TFloatField(monthsPlanQuery);
        dynamic_cast<TFloatField *>(field)->Precision = -2;
        field->Name = "used";
        monthsPlanQuery->Fields->Add(field);

        field = new TIntegerField(monthsPlanQuery);
        field->Name = "id";
        monthsPlanQuery->Fields->Add(field);

        field = new TIntegerField(monthsPlanQuery);
        field->Name = "year";
        monthsPlanQuery->Fields->Add(field);

        field = new TIntegerField(monthsPlanQuery);
        field->Name = "month";
        monthsPlanQuery->Fields->Add(field);
    }


а потом делать SQL запрос, но у меня не получилось,
Код

    monthsPlanQuery->SQL->Text = "select id , " + AnsiString(YearStart->Position) + " + number / 12 as year , number %12 + 1 as month , planed , used from avtodormonths where objectsubdivisionid = " + AnsiString(subDivisionQuery->FieldByName("osdid")->AsInteger) + " order by number";
    monthsPlanQuery->Active = true;
    monthsPlanQuery->FieldByName("id")->Visible = false;


на последней строчке ругается на то что Field "id" не найдено


--------------------
user posted image
PM MAIL ICQ   Вверх
FFFFFFF7
Дата 30.4.2007, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(stmamont @  29.4.2007,  23:33 Найти цитируемый пост)
на последней строчке ругается на то что Field "id" не найдено

его нет в объекте, хоть и есть в запрсе.
Цитата(Vyacheslav @  29.4.2007,  22:35 Найти цитируемый пост)
 колекцию требуемых TField  в дизайне.

прочитайте внимательнее.
Цитата(Klin @  29.4.2007,  20:53 Найти цитируемый пост)
ИМХО компьютер не хранит число 4, он хранит, что-то типа 3,99987

лол
//по сабжу: На крайняк есть RoundTo().
--------------------
Да помоги кодеру, а значит - ближнему своему!
PM MAIL   Вверх
stmamont
Дата 1.5.2007, 07:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



FFFFFFF7
а это что?
Код

        field = new TIntegerField(monthsPlanQuery);
        field->Name = "id";
        monthsPlanQuery->Fields->Add(field);

я добавил id
Цитата(FFFFFFF7 @  30.4.2007,  20:11 Найти цитируемый пост)
На крайняк есть RoundTo(). 

ага. по всей программе, во всем полях и datagrid'ах. прикольно наверное.

больше интересует решенеи с предустановкой TFields после создания кода.
Помогите! почему мой код не работает???
завтра уже нужно показать, а тут такой косяк!!!


--------------------
user posted image
PM MAIL ICQ   Вверх
Vyacheslav
Дата 1.5.2007, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Цитата(stmamont @  29.4.2007,  23:33 Найти цитируемый пост)
у меня и TQuery создается во время выполнения программы...

Когда я встречаю подобные фразы, у меня возникает вопрос:"А нафига?"
Кончено бывают случаи, когда есть смысл это делать в рантайме, но в большинстве случаев - это просто понты. Вы можете привести реальные причины, побудившие Ваc принять такое решение?

Добавлено через 6 минут и 32 секунды
Цитата(stmamont @  1.5.2007,  07:43 Найти цитируемый пост)
Помогите! почему мой код не работает???
завтра уже нужно показать, а тут такой косяк!!! 

Ну какие Вы все таки беспомощные. Нежели трудно хелп поглядеть. Тем более, что подсказка уже была
Цитата(Vyacheslav @  29.4.2007,  22:35 Найти цитируемый пост)
А для Field можно задать требуемый форма вывода: например фиксированный  с двумя цифрами после  запятой.  

Открываем хелп для TFloatField и находим проперти DisplayFormat


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
stmamont
Дата 2.5.2007, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В общем, у меня "почти" получилось сделать то, что я хотел.
Делается это следующим образом в моем случае
Код

        TField *field = new TAutoIncField(0);
        field->FieldName = "id";
        field->DataSet = subDivisionQuery;

        field = new TStringField(0);
        field->FieldName = "name";
        field->DataSet = subDivisionQuery;

        field = new TIntegerField(0);
        field->FieldName = "osdid";
        field->DataSet = subDivisionQuery;

        field = new TFloatField(0);
        dynamic_cast<TFloatField *>(field)->DisplayFormat = "#.##";
        field->FieldName = "limits";
        field->DataSet = subDivisionQuery;


и после этого, делаю sql запрос и продолжаю работать.
Отображение в DataGrid'е, DBEdit'е теперь именно такое как нужно.
Но когда я пробую
Код

Edit1->Text = subDivisionQuery->FieldByName("limits")->AsString;

все по старому

Вопрос: Как сделать чтобы DisplayFormat распространялся не только на DataControls?


--------------------
user posted image
PM MAIL ICQ   Вверх
Vyacheslav
Дата 2.5.2007, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

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



Эхх  smile 
Код

Edit1->Text = subDivisionQuery->FieldByName("limits")->DisplayText;


Добавлено через 7 минут и 34 секунды
Кстати, для гибкости  работы с полями существуют  еще события 
Код

__property TFieldGetTextEvent OnGetText = {read=FOnGetText, write=FOnGetText};
__property TFieldSetTextEvent OnSetText = {read=FOnSetText, write=FOnSetText};

С помощью которых, можно вообще подменять то, что будет выводится в контролах.





--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
bas
Дата 2.5.2007, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 446
Регистрация: 14.8.2002
Где: Молдова, Кишинев

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



Код

double Round(double Argument, int Precision)
{ double div = 1.0;
  if(Precision < 0) while(Precision++) div /= 10.0;
  else while(Precision--) div *= 10.0;
  return floor(Argument * div + 0.5) / div;
}


Добавлено через 2 минуты и 26 секунд
А почему не воспользоваться CAST в запросе?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

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


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

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


 




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


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

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