Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.26;
Скачать: CL | DM;

Вниз

Округление числа средствами InterBase в поле типа Float   Найти похожие ветки 

 
Kaginava ©   (2002-09-05 08:33) [0]

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


 
ЮЮ ©   (2002-09-05 08:41) [1]

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


 
Sergey13 ©   (2002-09-05 08:47) [2]

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


 
Kaginava ©   (2002-09-05 08:57) [3]

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


 
Vladislav ©   (2002-09-05 11:06) [4]

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


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

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


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

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


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

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


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

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

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


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

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


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

Попробуй создать таблицу с полем 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 15:30) [11]

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

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



Страницы: 1 вся ветка

Текущий архив: 2002.09.26;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
1-85458
AFrolov
2002-09-16 11:49
2002.09.26
Как присвоить значение i-му биту integer?


4-85735
CASU
2002-08-07 15:36
2002.09.26
НУЖНА ИКОНКА ИЗ ОКНА


7-85722
AlexPolyakov
2002-07-01 10:52
2002.09.26
Работа с USB


1-85482
Ежик
2002-09-16 16:38
2002.09.26
Как из txt файла вывести в memo слова начинающие, на букву


1-85584
SoniK
2002-09-14 15:10
2002.09.26
Компоненты