Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.006 c
8-85616
Yaro
2002-01-13 04:29
2002.09.26
Fast draw from array


1-85598
Morfey Cool
2002-09-14 23:31
2002.09.26
прoграмму мою вырубает АВП


7-85731
иван
2002-07-16 15:49
2002.09.26
TCanvas


1-85486
sachem
2002-09-16 18:51
2002.09.26
как сделать, что бы событие формы KeyPress действовало везде


14-85661
ErmSergey
2002-08-30 18:42
2002.09.26
Запуск ассоциированных с файлами программ





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский