С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

Хранения цены в SQLite - Программирование Android

29.10.2013, 15:03. Просмотров 1966. Ответов 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 до этого работал мало - какие нюансы стоит знать о математике?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2013, 15:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Хранения цены в SQLite (Программирование Android):

Место хранения файлов - Программирование Android
Здравствуйте! Я создал файл hello.html, где он будет находиться? Мне необходимо подгрузить его в Webview.

SQLite - Программирование Android
Приложение вылетает с ошибкой, не подскажете, в чём проблема? public class DatabaseHelper extends SQLiteOpenHelper { private...

SQLite - Программирование Android
Возвращаясь к старой теме, вернусь к проблеме. По рекомендации попробовал сделать от сюда Тут отправляем данные для записи в бд obj...

SQLite - Программирование Android
почему id = 0 ??? public void onClick(View view) { dataBase = new DataBase(context); sqLiteDatabase =...

SQLite - Программирование Android
Мне не подскажите где можно взять хорошие примеры по SQlite.

SQLite - Программирование Android
Создаю простенькую таблицу. db.execSQL("create table " + DATABASE_TABLE_NAME + " (" + ID_COLUMN + " integer primary key...

11
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 451
29.10.2013, 21:31 #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-х знаков после запятой. Но это уже отдельная история.
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
30.10.2013, 00:54  [ТС] #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)
0
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 451
30.10.2013, 10:24 #4
Цитата Сообщение от Tester64 Посмотреть сообщение
а числа в пределах от 0.0001 до 999999999999.9999, но ОЧЕНЬ точно
Вот для числа 999999999999.9999 тип float явно не подойдет.
Пишу свою первую программу на андроиде. В БД и переменных использую double. Проверял на 2.3 и 4.1.1 и пока что ни одна копейка не пропала.

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

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

7 знаков для float - маловато!
Я уже много лет только и работаю в 1С, но никогда не приходило в голову хранить целые вместо дробных .
Ну а расширять число знаков после запятой - вполне нормальная вещь.
0
Tester64
396 / 357 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
30.10.2013, 16:52  [ТС] #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 типа дробных - фиксированой дробной части и плавающей... В яве подобное есть?

Операции простые: +-*/ и формат вывода суммы, но надежность должна быть ИЗБЫТОЧНОЙ!
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
31.10.2013, 03:03 #12
Цитата Сообщение от Tester64 Посмотреть сообщение
Когда учил паскаль/си помню расказывали про 2 типа дробных - фиксированой дробной части и плавающей... В яве подобное есть?
BigDecimal - с фиксированной запятой
float, double - с плавающей

Добавлено через 4 минуты
http://www.opentaps.org/docs/index.p...al:_A_Tutorial
1
31.10.2013, 03:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2013, 03:03
Привет! Вот еще темы с ответами:

Выбор места хранения данных - Программирование Android
Пока не очень представляю как это сделать в Андроиде, поэтому прошу дать направление в какую сторону копать. Изучил различные адаптеры и...

Android и sqlite - Программирование Android
Вечер добрый, товарищи! Вопрос такой: как быстро считывать и передавать большое кол-во данных между приложением и БД? Речь идёт о...

RecyclerView и SQLite - Программирование Android
Нужно наполнить Recycler View данными из базы данных. Единственное решение, которое я нашел в сети, это достать данные из базы, перекинуть...

SQLite и android - Программирование Android
Привет. Вот решил посмотреть, что же такое android. Проконсультируете пожалуйста. 1. На сколько эффективно работает SQLite с 5-10...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.