Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

отображение FLOAT   Найти похожие ветки 

 
yk ©   (2005-05-25 10:33) [0]

Уважаемые Мастера!
Простите за нескромный вопрос,
как можно задать в запросе точность float до определённого знака?
например я выбираю цены товаров, и у меня в таблице выводятся
числа типа 45,3406768456, а мне надо только 45,34
(т.е. 45 руб 34 коп)

Заранее спасибо :)


 
Johnmen ©   (2005-05-25 10:36) [1]

DisplayFormat
Дл общего развития очень полезно http://www.delphikingdom.com/asp/viewitem.asp?UrlItem=/helloworld/reals.htm
Тип float не использовать, читать ibase.ru


 
msguns ©   (2005-05-25 10:43) [2]

Не надо лапать сервер без надобности. Достаточно округлять на клиенте (TFiedd.DisplayFormat)
Использование float без необходимости приводит к непредсказуемым результатам (см.Johnmen ©   (25.05.05 10:36) [1])


 
yk ©   (2005-05-25 10:45) [3]


> Johnmen ©


> читать ibase.ru

ЭТО?

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


Т.е. 45 руб 35 коп хранить как 4535 -integer,
а 13 руб 00 коп как 1300 -integer ?

А как тогда выводить правильно результат запроса цена в рублях?
Что бы в таблице отображалось на 4534 ,а 45,34 ?


 
yk ©   (2005-05-25 10:47) [4]


> msguns ©  


> Достаточно округлять на клиенте

Как ?
Результат запроса у меня идёт в DBGrid. Или я что-то не понимаю? 8(


 
Johnmen ©   (2005-05-25 10:53) [5]

>yk ©   (25.05.05 10:45) [3]

Надо чётко разделять такие понятия, как "хранение/вычисление" и "отображение". Они никак, по большому счёту, не связаны.

Как хранить - ещё раз, читай ibase.ru


 
yk ©   (2005-05-25 10:58) [6]


> читай ibase.ru

Это я распечатю и повешу на стену!
Действительно - там всё написано :)
http://www.ibase.ru/devinfo/round.htm


> Надо чётко разделять такие понятия, как "хранение/вычисление"
> и "отображение".

Вы абсолютно правы


 
evvcom ©   (2005-05-25 11:01) [7]


> Результат запроса у меня идёт в DBGrid. Или я что-то не
> понимаю?

Или "не знаю". Есть:
1. TField.OnGetText;
2. Calc-поля в DataSet


 
yk ©   (2005-05-25 11:06) [8]


> evvcom ©

Спасибо - обязательно посмотрю, но решила всё-таки перейти на integer, а результат выводить с помощью cast


 
sniknik ©   (2005-05-25 11:06) [9]

> Т.е. 45 руб 35 коп хранить как 4535 -integer,
> а 13 руб 00 коп как 1300 -integer ?
в принципе правильный подход, для денег самое то, только уже не ново... тип currency(money/или как там в IB денежный тип называется) именно так и реализован, только держит не два знака в псевдодробной части а четыре.
и в дельфях тоже самое.
т.е. используя этот тип добьешся тогоже но без собственных преобразований.


 
yk ©   (2005-05-25 11:19) [10]

http://www.ibase.ru/devinfo/round.htmNUMERIC(15, 2) или как DECIMAL(15, 2)
????

Как разберусь с этим обязательно напишу что получилось ;)


 
isasa ©   (2005-05-25 17:05) [11]

>Надо чётко разделять такие понятия, как "хранение/вычисление" >и "отображение". Они никак, по большому счёту, не связаны.

>Если вместо double использовать single (эквивалент FLOAT), то >результат будет еще хуже: -43,9400634765625

Совершенно верно, и поэтому выводить число single, как
-43,9400634765625
мягко выражаясь некорректно


 
yk ©   (2005-05-26 08:19) [12]

YrikGL !
Мне понравился вариант с decimal(15,2)
Предлагаю перевести цену на этот тип.
Или ты настаиваешь на integer ? (Какие аргументы ?)

Пока буду у себя с decimal работать...


 
msguns ©   (2005-05-26 09:14) [13]

>yk ©   (26.05.05 08:19) [12]
>Мне понравился вариант с decimal(15,2)

Если ТМЦ типа автомобилей или недвижимости, то вполне сойдет. Если же может быть мелочевка, то такой вариант рискован, лучше использовать сотые копеек (15,4)


 
Johnmen ©   (2005-05-26 09:24) [14]

>yk ©   (26.05.05 08:19) [12]

А что такое decimal(15,2)на самом деле ???

Может я уже давно чего-то не понимаю, вот автор сам нашел на ibase.ru и привел здесь ссылку на статью, отвечающую на все вопросы по данной теме. НО !!! Такое впечатление, что сам он эту статью не читал. Даже по диагонали...:(


 
Polevi ©   (2005-05-26 09:45) [15]

>msguns ©   (26.05.05 09:14) [13]
4 тоже может не хватить, у меня (20,8)


 
yk ©   (2005-05-26 09:49) [16]


> А что такое decimal(15,2)на самом деле ???

Для "виртуальных" типов данных NUMERIC(precision, scale) и DECIMAL (precision, scale) при объявлении поля анализируется его точность, и IB пытается "втиснуть" его в один из физических типов - в диалекте 1: smallint, integer, float, double precision - в соответствии с указанными precision и scale, в диалекте 3: smallint, integer, in64.

Собственно говоря, я хочу использовать decimal для того, чтобы не совершать преобразования ручками (могу запутаться :( )
Ну в Delphi конечно , если надо делаю RoundTo(num,-2)


 
yk ©   (2005-05-26 09:54) [17]


> msguns ©  


> Если же может быть мелочевка, то такой вариант рискован,
> лучше использовать сотые копеек (15,4)

Не очень понимаю зачем это :(
Для деления что-ли?


 
msguns ©   (2005-05-26 10:55) [18]

>Polevi ©   (26.05.05 09:45) [15]
>4 тоже может не хватить, у меня (20,8)

Зависит от специфики предметной области. На что я и намекнул. Цифра "4" была указана просто как пример

>yk ©   (26.05.05 09:54) [17]
>Не очень понимаю зачем это :(

Приходная накладная
-------------------------------
..
Пакеты п/э  шт: 10000    Цена за 1000:   12-38  Сумма 123-80

Продаются в розницу поштучно. Цена вх.за 1 ед 0-01,238 коп.

Примечание: Вх.цена нужна для насчета дохода от продажи и вообще для бухгалтерии


 
YK ©   (2005-05-26 15:53) [19]

у меня в проге надо вводить цену за штуку и количество изделий в поставке - итого подсчитывается
(храню цену за 1 шт, а не 1000 )
Может мне тогда особо и не нужны знаки после запятой  ?


 
msguns ©   (2005-05-26 15:58) [20]

>YK ©   (26.05.05 15:53) [19]
>(храню цену за 1 шт, а не 1000 )
>Может мне тогда особо и не нужны знаки после запятой  ?

Пример в [18] приведен как раз для иллюстрации нужности. Читайте ответы вдумчивее ;)


 
alex_***   (2005-05-26 18:15) [21]

у float поля в Delphi есть возможность задать маску для форматирования, насколько помню


 
msguns ©   (2005-05-27 09:13) [22]

>alex_***   (26.05.05 18:15) [21]
>у float поля в Delphi есть возможность задать маску для форматирования, насколько помню

см [2]


 
Danilka ©   (2005-05-27 09:25) [23]

[12] yk ©   (26.05.05 08:19)
Правильно тебе понравилось. :))

[15] Polevi ©   (26.05.05 09:45)
> 4 тоже может не хватить, у меня (20,8)

Для хранения чего, денег??? Ну-ну. Если какой-то коэффициент, например курс валюты, тогда, таки да. Если деньги, то и двух знаков достаточно для хранения, а в вычислениях надо использовать максимум.

Ну, шо, опять холивар? :))


 
Danilka ©   (2005-05-27 09:27) [24]

[18] msguns ©   (26.05.05 10:55)
Тоже вопрос спорный, но, честно говоря, с тобой по этому поводу надоело спорить. :)))


 
msguns ©   (2005-05-27 09:33) [25]

>Danilka ©   (27.05.05 09:27) [24]
>Тоже вопрос спорный, но, честно говоря, с тобой по этому поводу надоело спорить. :)))

Дань, ну кто ж тебя в попу-то колет - спорить ?
Если у тебя не было и нет причин беспокоиться о потери точности - и слава богу, и на здоровье !
Но опять же существуют разные предметные области, где точнось денежных характеристик (цена, сумма, курс  и т.д.) может быть и 2, и больше знаков дроби.
Я вообще не вижу тут предмета для спора. Однако на всякий случай советую новичкам: будьте предусмотрительны, помните о законах Мэрфи: если все у вас сегодня хорошо - то в ближайшее время случится что-нибудь непредвиденное, которое все испортит ;)


 
Danilka ©   (2005-05-27 09:42) [26]

[25] msguns ©   (27.05.05 09:33)
> Но опять же существуют разные предметные области, где точнось
> денежных характеристик (цена, сумма, курс  и т.д.) может
> быть и 2, и больше знаков дроби.

С этим согласен, за исключением того, что курс не является деньгами, а является коэффициентом.
Но с предыдущим твоми примером не совсем согласен - бухгалтерия все равно себестоимость партии будет списывать с точностью до двух знаков и дофига народу работает в 1с-ке и не жужжит по поводу точности 2 знака, и гвоздями успешно торгует. :)
Но, конечно, постановка она разная может быть и требования разные.


 
msguns ©   (2005-05-27 10:46) [27]

>Danilka ©   (27.05.05 09:42) [26]
>за исключением того, что курс не является деньгами, а является коэффициентом.

А тебе не приходило в голову, что валютный курс - это та же цена. Только денег ?


 
Danilka ©   (2005-05-27 10:53) [28]

[27] msguns ©   (27.05.05 10:46)
> А тебе не приходило в голову, что валютный курс - это та
> же цена. Только денег ?

Хм, по-моему все-таки нет. На мой взгляд, это не цена, а безразмерный коэффициент, такой-же как и количество. Когда умножаем или делим что-то на безразмерный коэффициент, получаем ту-же размерность, что была ранее. Умножаем деньги на ко-во - получаем деньги. Умножаем деньги на курс - получаем деньги.
:)


 
Danilka ©   (2005-05-27 10:56) [29]

хотя нет, не безразмерный: были рубли, стали доллары, но тем не менее - коэффициент.



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

Форум: "Базы";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.048 c
3-1117517931
Max Zyuzin
2005-05-31 09:38
2005.07.11
ADO и обновление одной записи


4-1114082819
Style
2005-04-21 15:26
2005.07.11
Как программно создать Dial-Up соединение ?


10-1095323969
zenit
2004-09-16 12:39
2005.07.11
Как добраться до событий MS Word из Delphi


1-1118835220
Uzver32.dll
2005-06-15 15:33
2005.07.11
ROR&ROL


1-1118525029
Николай,гер
2005-06-12 01:23
2005.07.11
поиск слова в тексте и удаление его !!!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский