Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
#1

Хранения цены в SQLite - Android

29.10.2013, 15:03. Просмотров 1715. Ответов 11
Метки нет (Все метки)

Гуру, посоветуйте!
На чем остановиться?

Кроме хранения нужны простые операции:
1) умножить на количество (возможно тоже дробное)
2) разделить на коефициент "в упаковке/ящике/контейнере"
3) округлить (например до целого, первого знака, десятков)
4) вывести в любом (а не только рекоментуемом гуглом) формате = 1.5, 1.50, "1,45", "1`234.5", "1 234.5" - с фиксироваными дробными или плавающими, с точкой-разделителем или запятой, с пробелом на тысячах или апострофом или без него...

Основных направления 3:
1) целые умноженые на 100 или на 1000.... Писать всю математику надо с нуля, может быть НАМНОГО медленнее встроеных средств. Пока цена 2 знака, встречал 3 (для "гвоздей" на граммы для округления в итоге), но может быть и 5-6. Перебирать и переумножать все старые цены после увеличения дробности - не разумно
2) строки которые можно "парсить" во FLOAT... проблемы только с форматом вывода. Возможно медленнее работает, но возможно сработает getFloat на поле запроса.
3) специальный формат SQLite для дробных. В инструкциях сказано что возможно. Редакторы предлагают - REAL, FLOAT, CURRENCY. Но кого поддерживает Android? Создал базу целых, запихнул туда флоат. В редакторах там 0, андроид вытягивает запихнутый флоат (123.456).

С FLOAT до этого работал мало - какие нюансы стоит знать о математике?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2013, 15:03     Хранения цены в SQLite
Посмотрите здесь:

Android Выбор места хранения данных
Android SQLite и умножения
Android SQLite
Место хранения файлов Android
Android SQLite
Android SQLite запрос
SQLite Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 420
29.10.2013, 21:31     Хранения цены в SQLite #2
Цитата Сообщение от Tester64 Посмотреть сообщение
Кроме хранения нужны простые операции:
1) умножить на количество (возможно тоже дробное)
2) разделить на коефициент "в упаковке/ящике/контейнере"
3) округлить (например до целого, первого знака, десятков)
4) вывести в любом (а не только рекоментуемом гуглом) формате = 1.5, 1.50, "1,45", "1`234.5", "1 234.5" - с фиксироваными дробными или плавающими, с точкой-разделителем или запятой, с пробелом на тысячах или апострофом или без него...
Я не гуру в андроиде, но в субд не плохой опыт.
Вопрос, можно ли это реализовать средствами SQL?
Да. Разве что по 4-му пункту будут заморочки, но тоже можно (но я бы форматировал уже полученную выборку).

Цитата Сообщение от Tester64 Посмотреть сообщение
Основных направления 3:
1) целые умноженые на 100 или на 1000.... Писать всю математику надо с нуля, может быть НАМНОГО медленнее встроеных средств. Пока цена 2 знака, встречал 3 (для "гвоздей" на граммы для округления в итоге), но может быть и 5-6. Перебирать и переумножать все старые цены после увеличения дробности - не разумно
2) строки которые можно "парсить" во FLOAT... проблемы только с форматом вывода. Возможно медленнее работает, но возможно сработает getFloat на поле запроса.
3) специальный формат SQLite для дробных. В инструкциях сказано что возможно. Редакторы предлагают - REAL, FLOAT, CURRENCY. Но кого поддерживает Android? Создал базу целых, запихнул туда флоат. В редакторах там 0, андроид вытягивает запихнутый флоат (123.456).

С FLOAT до этого работал мало - какие нюансы стоит знать о математике?
Есть еще DOUBLE. Наверное надежнее его выбрать, т.к. ниже погрешность.
Зачем хранить целые? Храните в double. Ну и что, что число в БД будет иметь значение что то типа 12.000000000001 - это нормально.
Кол-во сохраняемых знаков после запятой - проблема не SQLite, а разработчика.
Как угодно, так и округляем и только искусственно ограничиваем ввод знаков после запятой. Я бы выбрал не меньше 3-х знаков.
И кстати, если сохраняем сумму строки (цена * колво * скидка) иногда имеет смысл не обрезать до 2-х знаков после запятой. Но это уже отдельная история.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
30.10.2013, 00:54  [ТС]     Хранения цены в SQLite #3
Цитата Сообщение от Slon747 Посмотреть сообщение
Есть еще DOUBLE
Я знаю. Просто хотел узнать про "надежность" и "поддерживаемость" типов. Мало-ли вдруг DOUBLE в прошлых версиях заменен на REAL, FLOAT, CURRENCY. Или это одно и то-же? Различает ли их андроид.
12.000000000001 - не проблема, но не хочется что-бы позднее оказалось что отрицательные не поддерживает или знаков ДО точки всего 5... Одинаковые значения ли возврают эти типы при getFloat? Пишу ведь не 3Д координаты, не GPS, а числа в пределах от 0.0001 до 999999999999.9999, но ОЧЕНЬ точно. Если будет 0.020000000001 - округлю, но что-бы не потерял 2 копейки...
Важна
1) надежность (не потеряй число ни в коем случае)
2) поддержка этого типа ВСЕМИ андроидами (хотя-бы в пределах от 2.3 до 4.2)
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 420
30.10.2013, 10:24     Хранения цены в SQLite #4
Цитата Сообщение от Tester64 Посмотреть сообщение
а числа в пределах от 0.0001 до 999999999999.9999, но ОЧЕНЬ точно
Вот для числа 999999999999.9999 тип float явно не подойдет.
Пишу свою первую программу на андроиде. В БД и переменных использую double. Проверял на 2.3 и 4.1.1 и пока что ни одна копейка не пропала.

Цитата Сообщение от Tester64 Посмотреть сообщение
но не хочется что-бы позднее оказалось что отрицательные не поддерживает или знаков ДО точки всего 5
Отрицательные числа, конечно, поддерживаются. А знаки до точки не ограничиваются. Ограничение накладывается на всё число целиком. Т.е. при float потеря знаков начнется после точки.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
30.10.2013, 13:17  [ТС]     Хранения цены в SQLite #5
Цитата Сообщение от Slon747 Посмотреть сообщение
Вот для числа 999999999999.9999 тип float явно не подойдет
Почему? Есть где-нибудь инфо об этих типах и ограничениях для базы данных???
Где-то встречал что integeg - 64 бита, как и float.... а потом понял что float может еще делиться...
Встретил shortint... sting[23], хотя думал что изначальньно база SQLite была "без типовой" и для простоты было введено 3 базовых типа - целое, строка и логическое...
chedman
80 / 79 / 2
Регистрация: 30.10.2013
Сообщений: 250
30.10.2013, 13:28     Хранения цены в SQLite #6
смотри здесь http://www.sqlite.org/datatype3.html
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 420
30.10.2013, 13:32     Хранения цены в SQLite #7
Цитата Сообщение от Tester64 Посмотреть сообщение
Почему? Есть где-нибудь инфо об этих типах и ограничениях для базы данных???
Где-то встречал что integeg - 64 бита, как и float.... а потом понял что float может еще делиться...
Встретил shortint... sting[23], хотя думал что изначальньно база SQLite была "без типовой" и для простоты было введено 3 базовых типа - целое, строка и логическое...
Насчет SQLite я не знаю, но в Java тип данных float ограничен 4 байтами. Учитывая отрицательные числа получаем 7 значащих цифр (неважно до или после запятой). У double вдвое больше
chedman
80 / 79 / 2
Регистрация: 30.10.2013
Сообщений: 250
30.10.2013, 13:39     Хранения цены в SQLite #8
Особо не парся на счет типа. Например в Access и VB6 для внутреннего представления денежного типа используется длинное целое, но как только надо показать пользователю результат, просто точку ставят после четвертой цифры с права.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
30.10.2013, 15:33  [ТС]     Хранения цены в SQLite #9
Цитата Сообщение от chedman Посмотреть сообщение
после четвертой цифры с права
Когда работал в 1С некоторые фирмы просили расширить курс валюты до 6 знаков... Тоже думал о целых для хранения. Легко хранить, легко превратить в строку. Легко строку разделить точкой/запятой на дробные и пробелом/апострофом на тысячные. Легко разделив на 100 превратить во float и работать дальше с дробными. А float *100 и округлив получить целые для хранения... Надежность высокая. Точность вроде 64 бита (гиганская). Смутила только потеря производительности на преобразованиях и какой-то "не професионализм" (вдруг есть нормальное решение для дробных).

7 знаков для float - маловато!
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 420
30.10.2013, 15:41     Хранения цены в SQLite #10
Цитата Сообщение от Tester64 Посмотреть сообщение
Когда работал в 1С некоторые фирмы просили расширить курс валюты до 6 знаков... Тоже думал о целых для хранения. Легко хранить, легко превратить в строку. Легко строку разделить точкой/запятой на дробные и пробелом/апострофом на тысячные. Легко разделив на 100 превратить во float и работать дальше с дробными. А float *100 и округлив получить целые для хранения... Надежность высокая. Точность вроде 64 бита (гиганская). Смутила только потеря производительности на преобразованиях и какой-то "не професионализм" (вдруг есть нормальное решение для дробных).

7 знаков для float - маловато!
Я уже много лет только и работаю в 1С, но никогда не приходило в голову хранить целые вместо дробных .
Ну а расширять число знаков после запятой - вполне нормальная вещь.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
30.10.2013, 16:52  [ТС]     Хранения цены в SQLite #11
Цитата Сообщение от Slon747 Посмотреть сообщение
Я уже много лет только и работаю в 1С, но никогда не приходило в голову хранить целые вместо дробных .
Ну а расширять число знаков после запятой - вполне нормальная вещь.
Аналогично. Но в 1С ОЧЕНЬ высокая надежность при работе с дробными. Там не бывает такого что пишешь в базу 1.00, а получаешь 1.0000000000001. Там заранее известно что предел цифровых 19 чисел/символов, а нормой для суммы является "Ч19.2". Мне нужна ТАКАЯ-ЖЕ надежность! Если я в базу записал что гвоздь стоит 0.0001 копейку, то в базу запишется именно это. И если я захочу расширить дробность до 6, то либо она должна быть там УЖЕ заложена до 10-12 знаков, а я просто начну их использовать либо это должно пройти легко для старых записей в базе. И при этом не должны пострадать суммы в 10 миллионов. С целыми 64 бита это надежно, но надо писать "обвертку" для математических действий. Со строками это еще надженее - пределов нет в обе стороны ("-999999.00009" до 255 символов минимум). Дробных боюсь. На выносливость SQLite не тестировал. И не знаю пределов его чисел. -100..+100 работают, но более "кривые" числа - пугают!

Еще не хочу "влипнуть" в пределы явы при работе с дробными. В 1С были казусы - когда 100000 запихиваешь в число "Ч3.0", получаешь 999. В Паскале/Делфи бывает при "переполнении" обратное - 257 в байт получаешь -1.

Когда учил паскаль/си помню расказывали про 2 типа дробных - фиксированой дробной части и плавающей... В яве подобное есть?

Операции простые: +-*/ и формат вывода суммы, но надежность должна быть ИЗБЫТОЧНОЙ!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2013, 03:03     Хранения цены в SQLite
Еще ссылки по теме:

JSON в SQLite Android
Android SQLite
SQLite Android Android
Android SQLite
Android Не создается DB SQLite

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
31.10.2013, 03:03     Хранения цены в SQLite #12
Цитата Сообщение от Tester64 Посмотреть сообщение
Когда учил паскаль/си помню расказывали про 2 типа дробных - фиксированой дробной части и плавающей... В яве подобное есть?
BigDecimal - с фиксированной запятой
float, double - с плавающей

Добавлено через 4 минуты
http://www.opentaps.org/docs/index.p...al:_A_Tutorial
Yandex
Объявления
31.10.2013, 03:03     Хранения цены в SQLite
Ответ Создать тему
Опции темы

Текущее время: 10:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru