Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Округление числа средствами InterBase в поле типа Float [D6, IB5.x, IB6.x]


Kaginava ©   (2002-09-05 08:33:00) 

Добрый всем день!
Подскажите как в InterBase в поле типа Float хранить число, но что бы при заненесении в это поле вещественного числа
оно округлялось например до 3 знаков после запятой.
Можно ли это сделать средствами InterBase например может использовать какой нибудь другой тип данных.
Заранее всем спасибо.


Иван Шихалев   (2002-09-05 15:30:00) [1]

Влияет на самом деле по разному - внутреннее представление NUMERIC и DECIMAL зависит от размера и точности и может быть как целым (от 16bit до 64bit), так и с плавающей точкой - очевидно (15,2) представляется плавающей точкой.

PS. Дровишки из руководства по IB API.


Wolf226   (2002-09-05 14:31:00) [2]

Попробуй создать таблицу с полем summa типа NUMERIC(15,2), занеси через SQL Explorer три значения 1.004 и выполни
select sum(summa) from ... и получишь 3.01. Влияет (15,2) похоже только на отображение (ведь не 3.012 показало). Так что округлять вручную надо. Это когда я в IBExpert заносил, то он сам брал 1.004 округлял до 1 при вводе. Также и надо делать и в программе или с помощью тригеров.


Иван Шихалев   (2002-09-05 14:14:00) [3]

Замечу, что число с заданной точностью (фиксированной точкой) в IB определяется типами NUMERIC(n,m)и DECIMAL(n,m)


Wolf226   (2002-09-05 13:08:00) [4]

P.S. Сорри, я привел случай для update триггера для View - которая не Live и где надо писать так обновление. (ну естественно указать все поля, а не так как выше)

А если использовать Тригера для таблицы или для Live View,
то достаточно написать
new.fieldname=(cast(new.fieldname*1000 as integer))/1000


Wolf226   (2002-09-05 13:03:00) [5]

Округлить при показе, а хранить в базе то что ввели - это нехорошо. А если потом отчет делать? Что округлять каждый раз при построении? А поставить тригер на Before insert и Before Update.
Например
update tablename
set fieldname=(cast(new. fieldname*1000 as integer))/1000
where idfield= old.idfield


Desdechado   (2002-09-05 12:49:00) [6]

вообще-то все типы с плавающей запятой не хранят точных значений.
4.5 может быть и 4.4999999999, и 4.500000000001
Вы вспомните аппаратное представление этих чисел в компьютере через мантиссу и основание - и все станет ясно. А округлять надо на клиенте при показе.


Wolf226   (2002-09-05 11:49:00) [7]

(cast ( fieldname*1000 as integer))/1000


Vladislav   (2002-09-05 11:06:00) [8]

Лично я использую UDF. В свое время я здорово "попарился" с этими округлениями. Кстати, вроде на сайте борланда есть уже готовые удф, в которых масса подобных функция. Качай - подключай - используй.


Kaginava   (2002-09-05 08:57:00) [9]

ясно спасибо :))
попробую с UDF


Sergey13   (2002-09-05 08:47:00) [10]

2Kaginava © (05.09.02 08:33)
Плюнь на все типы и напиши свою UDF на округление. Борланды плохо хранят числа. Что-то у них не в порядке с преобразованием. Поэтому пишешь свою ROUND-функцию (или возьми готовую на ib.demo.ru, или как он там сейчас) и вставляешь везде где нужно в запросы.


ЮЮ   (2002-09-05 08:41:00) [11]

А зачем, спрашивается, хранить длину в метрах, если измерения произволятся и записываются в милиметрах? Т.е. хранить данные как Integer, при Float неизбежна погрешность.


Наверх

Титульная страница Поиск, карта сайта Написать письмо