Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 21:07 28.06.24 
Компютри и Интернет
   >> Delphi
*Кратък преглед

Страници по тази тема: 1 | 2 | >> (покажи всички)
Тема InterBase & типа FLOAT  
АвторEfex (Нерегистриран)
Публикувано02.02.04 15:48



C++ & Delphi

проблема е следния :

имам таблица X в която имам поле Y от тип FLOAT

при присвояване
....
S = "0.3249";
IBStoredProc->Params->Items[y]->AsFloat = StrToFloat(S);
...

в базата се записва числото 0.32490000128746
т.е. не се нулират последните 6 позиции в числото и при по нататашни изчисления имам проблем с точноста.

Някой има ли идея как се нулират тези послени позиции или как изобщо се решава този проблем.

благодаря предварително.



Тема Re: InterBase & типа FLOATнови [re: Efex]  
Автор NDeu (динозавър)
Публикувано02.02.04 16:27



Ако искаш да работиш с числа с фиксирана точност ползвай NUMERIC()



Тема Re: InterBase & типа FLOATнови [re: NDeu]  
АвторEfex (Нерегистриран)
Публикувано02.02.04 19:13



С NUMERIC нещата са още по зле защото при заявка :
..
X NUMERIC(15,6)
Y NUMERIC(15,6)
...
SELECT X * Y
...
се получава велик резултат от вида 14325245.31254

и спасението е SELECT CAST(X * Y AS FLOAT)
.....
но не си е работа....ако ме разбираш... :))))))))



Тема Re: InterBase & типа FLOATнови [re: Efex]  
Автор NDeu (динозавър)
Публикувано02.02.04 23:32



От


20. Не надо использовать тип FLOAT
этот тип данных имеет длину 4 байта и точность всего 7 цифр. Эквивалентом в Delphi является single. Если хотите использовать вещественные числа, то сначала попробуйте перемножить и поделить два таких числа прямо в Delphi - так вы увидите точность вычислений, что исключит впоследствии проблемы с хранением и обработкой таких данных в базе.


вж. също



Редактирано от NDeu на 02.02.04 23:34.



Тема Re: InterBase & типа FLOATнови [re: NDeu]  
АвторEfex (Нерегистриран)
Публикувано04.02.04 16:54



ВСИЧКО ДОБРЕ НО!!!!!

ТБЛИЦА STOR;
//всички полета от NOMQNT1 до NOMPRICE3 са от тип NUMERIC(15,6)

IDSTOR | IDNOM | NOMQNT1 | NOMQNT2 | NOMQNT3 | NOMPRICE1 | NOMPRICE2 | NOMPRICE3

1 | 1 | 9 | 5 | 4 | 0.3 | 0.5 | 0.3


ПРИ UPDATE В КОНЗОЛАТА ИЛИ ЧРЕЗ IBQUERY :

=======================
UPDATE STOR
SET NOMQNT2 = NOMQNT2 + 5,
NOMPRICE3 = FORMATFLOAT( ( (NOMQNT1 + NOMQNT2 - NOMQNT3)*NOMPRICE3 + (5 * 0.43))/
((NOMQNT1 + NOMQNT2 - NOMQNT3)+5),4
),
NOMPRICE1 = 0.43
=======================
СЕ ПОЛУЧАВА РЕЗУЛТАТ NOMPRICE3= 0.3325 ?!?!?!?!?!?!?

<<<<<<<<<<>>>>>>>>>>>>>>

А ПРИ SELECT :
==================
select FORMATFLOAT( ( (NOMQNT1 + NOMQNT2 - NOMQNT3)*NOMPRICE3 +
(5 * 0.43)
)/((NOMQNT1 + NOMQNT2 - NOMQNT3)+5),4)
FROM STOR
==================
СЕ ПОЛУЧАВА РЕЗУЛТАТ 0.3433 КОЕТО Е КОРЕКТНИЯ РЕЗУЛТАТ !!!!!

дори и без използването на FORMATFLOAT положението е същото???

НЯКОЙ ЗНАЕ ЛИ ЩО ЗА ФЕНОМЕН Е ТОВА????

Всичко е зле когато завършва ЗЛЕ.



Тема Re: InterBase & типа FLOATнови [re: Efex]  
Автор andrew_nikoloff (минаващ)
Публикувано04.02.04 17:29



Ами много просто - това не е феномен. Защо използваш FormatFloat и сигурен ли си, че някъде там не ти се объркват нещата? Изкарай си междинните резултати и виж къде ти се закръгля. Защо изобщо тези сметки ги правиш в SQL? Уверявам те, че в програмата също могат да се сметнат. Освен това изпълнения от вида s := '1.23456'; f := StrToFloat(s); нито са производителни, ното са точни. Не ти гарантирам, че StrToFloat ще ти върне 1.23456 а не примерно 1.2345597534232 или нещо такова...



Тема Re: InterBase & типа FLOATнови [re: Efex]  
Автор NDeu (динозавър)
Публикувано04.02.04 18:28



1. Този ФЕНОМЕН показва, че при update нe се гарантира изолираност на операциите.
След
NOMQNT2 = NOMQNT2 + 5,
в израза
NOMPRICE3 = ( (NOMQNT1 + NOMQNT2 - NOMQNT3)*NOMPRICE3 + (5 * 0.43))/((NOMQNT1 + NOMQNT2 - NOMQNT3)+5)
NOMQNT2 вече участва с новата си стойност.
Размени местата на NOMQNT2 и NOMPRICE3 в update-то и ще получиш каквото ти трябва.

2. Не препоръчвам използването на FORMATFLOAT в този случай. Просто не е необходимо

3. Не е добър стил ДА КРЕЩИШ ПО ФОРУМИТЕ. Говори за склонност към истерия Пък и трудно се чете

Успех



Тема Re: InterBase & типа FLOATнови [re: andrew_nikoloff]  
АвторEfex (Нерегистриран)
Публикувано05.02.04 11:14



andrew.....
не съм съгласен с теб !!!
т.е. << Защо изобщо тези сметки ги правиш в SQL? >>

Според теб защо изобщо съществува SQL ако не се използва едно от най силните му преимущества да спестиш 70% код от сметки!!!
//и това разбира се не е всичко но не мисля да споря на тази тема :)))
А и какъв е смилсъла да използвам SQL само за банка-данни
все пак благодаря за съдейтвието..



Тема Re: InterBase & типа FLOATнови [re: NDeu]  
АвторEfex (Нерегистриран)
Публикувано05.02.04 11:29



Very very 10x NDeu....

Разбира се почти винаги грешката е в питащия...
Наистина се оказа че "РЕДА" на изпълнение в UPDATE има значение което аз до сега не го знаех...

Относно крещенето .... не е точно това което си "видял"...:)))
част от навиците ми, е да пиша с големи букви... но не че не виждам и не че крещя... а просто навик...
// и аз не обичам да пушат около мен защото нямам навика да пуша :))))

Още веднъж много благодаря за помоща ти защото ми беше вери спешъл.....

но има още един не толкова "BIG" проблем...

========
X NUMERIC(15,6); //5
Y NUMERIC(15,6); // 0.43

заявка в QUERY :

SELECT X * Y ми връща 2 955.8141

а при

SELECT CAST(X * Y AS FLOAT) ми връща 2.1500 //което е вярното...


10x



Тема Re: InterBase & типа FLOATнови [re: Efex]  
Автор andrew_nikoloff (минаващ)
Публикувано05.02.04 12:06



Не знам защо си мислиш, че ще спестиш 70% код от сметки, когато изнесеш сметките от по-високопроизводителна система като компилираната ти програма на делфи, в SQL заявката ти, която определено се изпълнява по-бавно, определено се поддържа по-трудно и определено като гледам ти е доста децентрализирана...
Много по-ясно и по-продуктивно, а и значително по-универсално за теб (а и от там по-кодоспестяващо) ще е вместо

UPDATE STOR
SET NOMQNT2 = NOMQNT2 + 5,
NOMPRICE3 = FORMATFLOAT( ( (NOMQNT1 + NOMQNT2 - NOMQNT3)*NOMPRICE3 + (5 * 0.43))/
((NOMQNT1 + NOMQNT2 - NOMQNT3)+5),4
),
NOMPRICE1 = 0.43

да си напишеш

update stor set
nomqnt1 = :nomqnt1,
nomqnt2 = :nomqnt2,...

и да си използваш сметките в ехе-то или поне в сторедпроцедура, отколкото да пишеш магически изрази като горния, които дори ти не успя да разбереш какво всъщност вършат.

А по-въпроса за или против използването на SQL само за банка-данни (предполагам всъщност имаш предвид ползването на базата данни само за банка данни, защото не виждам как можеш да съхраниш каквито и да е данни в SQL) - бизнес логиката не се съхранява в базата данни под формата на SQL заявки, записани в пропъртитата на Query-то ти е делфи, а като сухранени процедури, тригери и други подобни неща в самата база например...




Страници по тази тема: 1 | 2 | >> (покажи всички)
*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.