Форум: "Базы";
Текущий архив: 2002.09.26;
Скачать: [xml.tar.bz2];
ВнизОкругление числа средствами 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c