Гость
Форумы / Android [игнор отключен] [закрыт для гостей] / Вычитание из double - почему такой результат? / 17 сообщений из 17, страница 1 из 1
18.02.2015, 11:00
    #38882603
Микола Питерский
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычитание из double - почему такой результат?
Выполняю вот это:
Код: java
1.
Log.d("NP", "(122.52 - 122)=" + (122.52 - 122));



и получаю:
Код: java
1.
(122.52 - 122)=0.519999999999996



как так - вроде по логике должно быть 0.52 ?


И второй вопрос - это результат моей попытки получить дробную часть числа. Может есть более элегантный способ это сделать?
Код: java
1.
2.
3.
 double cena = 122.52;
 int money_pref = (int) cena; // целая часть
 int money_suf = (int) ((cena - money_pref) * 100); // дробная часть



Модератор: Изменен заголовок
...
Рейтинг: 0 / 0
18.02.2015, 11:03
    #38882612
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычитание из double - почему такой результат?
Я догадываюсь, что за хрень и вроде как обходил её, но, к сожалению, сейчас пока не могу подсказать.
Будь добр, придумай нормальное название теме. :)

П.С. http://stackoverflow.com/questions/8148684/what-is-the-best-data-type-to-use-for-money-in-java-app
...
Рейтинг: 0 / 0
18.02.2015, 11:50
    #38882678
Микола Питерский
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычитание из double - почему такой результат?
Новое название темы: вычитание из double - почему такой результат?

И не думал что жава такую подлянку подкинет - все до этого было просто идеально - был вроде идеальный язык.
В делфи с double таких непоняток не возникало, а если и были проблемы - то для дробных чисел там был тип currency - в жаве вижу он тоже есть - но он совсем не для расчетов, а чтобы получить данные по деньгам из системы и вместо double рекомендуют использовать BigDecimal в котором все операции только через его методы и на входе строка.
Как так - это же куча плохо читаемого кода? Из базы получаем цену, остатки и т.д. обязательно в строку, затем с помощью currency определяем какой разделитель между целой и дробной частью, затем разделяем эту строку на целую и дробную часть и помещаем их в ДВЕ переменные BigDecimal и дальше с их помощью делаем опять кучу кода.
Может всетаки есть какой-то более простой способ???
...
Рейтинг: 0 / 0
18.02.2015, 12:22
    #38882728
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычитание из double - почему такой результат?
Микола ПитерскийМожет всетаки есть какой-то более простой способ???
float?
...
Рейтинг: 0 / 0
18.02.2015, 12:43
    #38882761
Микола Питерский
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычитание из double - почему такой результат?
Кароче жава вообще не годится для финансовых расчетов:

Код: java
1.
2.
Log.d("NP", "(122.52f - 122f)="+ (122.52f - 122f));
Log.d("NP", "new BigDecimal(0.175d)=" + (new BigDecimal(0.175d)));



вывод:
Код: java
1.
2.
(122.52f - 122f)=0.51999664
new BigDecimal(0.175d)=0.174999999999999988897769753748434595763683319091796875



на ней только игрушки писать :)
...
Рейтинг: 0 / 0
18.02.2015, 14:41
    #38882919
Микола Питерский
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычитание из double - почему такой результат?
Короче результат моих "умозаключений" следующий:
хоть SQLLite и поддерживает поля типа numeric(19,2) об этом забываем как и о функциях чтения\записи в базу getDouble, getFloat, put(double d), put(float f ) - иначе там будет часто храниться то что вы вообще не предполагаете.
Нужно использовать только целые типы полей, т.е. integer, biginteger (long) и работать с ними соответствующими функциями.
Если это суммы - то храним число в копейках, если вес - то число в граммах и т.д..

Иначе - посадят с конфискацией :)
...
Рейтинг: 0 / 0
18.02.2015, 14:56
    #38882943
Джибс
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычитание из double - почему такой результат?
да это похрен.

при выводе инфы и , нормальном округлении, все равно
получится нормально.
...
Рейтинг: 0 / 0
18.02.2015, 15:14
    #38882968
Микола Питерский
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычитание из double - почему такой результат?
Джибс, у меня при выводе получалось отклонение на 1 копейку по многим записям и в сумме набегает очень много.
...
Рейтинг: 0 / 0
18.02.2015, 15:34
    #38883000
Микола Питерский
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычитание из double - почему такой результат?
И нельзя делать промежуточные расчеты результатом которых станет тип double:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
long sum = 1234567890123456789L;

Log.d("NP", "sum=" + sum );
Log.d("NP", "((double)sum / 100)="+  ((double) sum / 100)); // нельзя так делать
Log.d("NP", "(sum * 1.00 / 100)="+  ( sum * 1.00 / 100)); // нельзя так делать
Log.d("NP", "Function.round(( sum / 100), 2)="+  Function.round(( sum / 100), 2));
Log.d("NP", "Math.round(( sum / 100)="+  Math.round(( sum  / 100)));

long rub = sum / 100;
long cop = sum  - rub * 100;

Log.d("NP", "rub="+  rub);
Log.d("NP", "cop="+  cop);


вывод:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
sum=1234567890123456789
((double)sum / 100)=1.2345678901234568E16
(sum * 1.00 / 100)=1.2345678901234568E16
Function.round(( sum / 100), 2)=1.2345678901234568E16
Math.round(( sum / 100)=2147483647
(sum / 100)=12345678901234567
rub=12345678901234567
cop=89
...
Рейтинг: 0 / 0
18.02.2015, 16:03
    #38883050
Микола Питерский
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычитание из double - почему такой результат?
Джибсда это похрен.
при выводе инфы и , нормальном округлении, все равно
получится нормально.

Одно дело когда это расчет зарплаты - то похрен что там посчиталось меньше на пару рублей, другое дело если это программа по учету н-р драгметалов, в которой оператор вводит "содержание драгметалла в изделии 0.52 грамма" , а на самом деле в базе сохранится 0.51999664 грамма, а если таких изделий много - то отклонение в общей сумме будет очень большое.
...
Рейтинг: 0 / 0
18.02.2015, 16:35
    #38883098
wamaco
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычитание из double - почему такой результат?
Микола ПитерскийДжибсда это похрен.
при выводе инфы и , нормальном округлении, все равно
получится нормально.

Одно дело когда это расчет зарплаты - то похрен что там посчиталось меньше на пару рублей, другое дело если это программа по учету н-р драгметалов, в которой оператор вводит "содержание драгметалла в изделии 0.52 грамма" , а на самом деле в базе сохранится 0.51999664 грамма, а если таких изделий много - то отклонение в общей сумме будет очень большое.

согласен на 100%!
Недавно столкнулся с этим. Деньги стал хранить в копейках (int64), но это не дело конечно.
...
Рейтинг: 0 / 0
18.02.2015, 16:40
    #38883115
Джибс
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычитание из double - почему такой результат?
Микола ПитерскийДжибсда это похрен.
при выводе инфы и , нормальном округлении, все равно
получится нормально.

Одно дело когда это расчет зарплаты - то похрен что там посчиталось меньше на пару рублей, другое дело если это программа по учету н-р драгметалов, в которой оператор вводит "содержание драгметалла в изделии 0.52 грамма" , а на самом деле в базе сохранится 0.51999664 грамма, а если таких изделий много - то отклонение в общей сумме будет очень большое.

не, ну если такая точность, то может быть.
я как то не обращал внимание.
...
Рейтинг: 0 / 0
18.02.2015, 16:55
    #38883133
Микола Питерский
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычитание из double - почему такой результат?
ДжибсМикола Питерскийпропущено...
Одно дело когда это расчет зарплаты - то похрен что там посчиталось меньше на пару рублей, другое дело если это программа по учету н-р драгметалов, в которой оператор вводит "содержание драгметалла в изделии 0.52 грамма" , а на самом деле в базе сохранится 0.51999664 грамма, а если таких изделий много - то отклонение в общей сумме будет очень большое.

не, ну если такая точность, то может быть.
я как то не обращал внимание.

Я немного не так написал:
оператор вводит "содержание драгметалла в изделии 0.52 грамма" , а на самом деле в double переменной сохранится 0.51999664, а при записи в базу SQLite отрежет в свой numeric(3,2) число 0.51 - т.е. на каждой сотне изделий отклонение в учете золота будет 1 грамм !!! Это капец.

Джибс, ты же вроде провайдеры для БД пишешь - как ты всеже юзаешь поля типа numeric(,1..10) ? Потому как в целых мне хранить как-то стремно - тоже много лишней работы.

А можно ли в поле типа numeric(,1..10) записать строку - типа put(, String s) ?
...
Рейтинг: 0 / 0
18.02.2015, 17:15
    #38883167
Джибс
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычитание из double - почему такой результат?
да я как то суммы не хранил.

а последний проект, использую больше как key-val хранилише.

мне так надело постоянно менять структуру БД, и делать поддержку версионности, хотя для этого уже полно инструментов и конверторов.
что я ушел в хранение данных в json
там вообще все равно

сохраняю строку

а когда выдергиваю, собираю в модели объекты.
данных у меня много не бывает, по этому не критично.

понятно что просто key-val туп не обойтись, приходится некоторые поля, для селектов, все же дублировать "нормальными" полями
...
Рейтинг: 0 / 0
18.02.2015, 17:25
    #38883186
Микола Питерский
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычитание из double - почему такой результат?
Джибс что я ушел в хранение данных в json там вообще все равно

Я давно работаю с JSON - но о хранении в нем не слышал. Ты что жейсоновскую строку в Мемо поле сохраняешь?
...
Рейтинг: 0 / 0
18.02.2015, 23:23
    #38883411
wamaco
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычитание из double - почему такой результат?
Джибсда я как то суммы не хранил.

а последний проект, использую больше как key-val хранилише.

мне так надело постоянно менять структуру БД, и делать поддержку версионности, хотя для этого уже полно инструментов и конверторов.
что я ушел в хранение данных в json
там вообще все равно

сохраняю строку

а когда выдергиваю, собираю в модели объекты.
данных у меня много не бывает, по этому не критично.

понятно что просто key-val туп не обойтись, приходится некоторые поля, для селектов, все же дублировать "нормальными" полями

не, ну это не выход.... это костыли!
...
Рейтинг: 0 / 0
19.02.2015, 09:25
    #38883557
ukku
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычитание из double - почему такой результат?
Код: java
1.
new BigDecimal(0.175d, MathContext.DECIMAL64);


?
...
Рейтинг: 0 / 0
Форумы / Android [игнор отключен] [закрыт для гостей] / Вычитание из double - почему такой результат? / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]