|
|
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Самоловских Виталий aka KefirНастоятельно рекомендую: 1. Прочитать книгу начального уровня про Java 2. Прочитать книгу Брюса Тейта "Горький вкус Java" ("Bitter Java") 3. Посетить сайт http://www.skipy.ru/ По вашему, коду: может он и работает, но там все неправильно. Начиная от именования переменных и заканчивая вычислениями в JSP.Спасибо. Почитаем. За то, что хоть не запинали, тоже отдельное спасибо. Не знаю, как насчет остального, но код примера я с головы писал. Возможно, не по сложившимся правилам, синтаксису. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 10:41 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Semen PopovЯ хочу понять, почему мое решение неправильное, и хотел бы увидеть решение. А не обсуждать, насколько все такие, язык такой, а остальные - прелесть Уже где-то обсуждали. Плавающие типы данных предназначены для научных вычислений. И форма хранения отличается от финансовой. Грубо говоря, при операциях сложения-вычитания вы будете фиксировать некую погрешность, которая возникать в принципе не должна. Лучше (в порядке приоритета): 1) Использовать финансовые вычисления в базе во внутренних (native) типах и выводить результат с использованием JSP. 2) Использовать наибилее близкие wrappers к тем типам денежных величин (ex oracle.jdbc.NUMBER) и выполнять операции непосредственно с ними. 3) Использовать арифметику целых чисел (переводить денежные типы в копейки) и публиковать соотв. с форматированием дробных разрядов. 4) Прочие варианты. Использование символьных вычислений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 10:55 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
автор3) Использовать арифметику целых чисел (переводить денежные типы в копейки) и публиковать соотв. с форматированием дробных разрядов. Реально самый простой и толковый способ для обычных приложений. Советую начать с него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 11:25 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
maytonУже где-то обсуждали. Плавающие типы данных предназначены для научных вычислений. И форма хранения отличается от финансовой. Грубо говоря, при операциях сложения-вычитания вы будете фиксировать некую погрешность, которая возникать в принципе не должна.Это понятно. Мне не понятно, почему эта погрешность проявляется уже в десятых и сотых долях. Для меня не было бы удивлением, если бы я сложил 1.25 с 1.25 и в итоге бы получил 1.500000000000001. Но, вот убеждаюсь, что реализация дробного числа особенная, и это надо учитывать. Да, столкнулся с этим в реализации финансовых операций. Но хотел узнать особенности работы с плавающими типами данными в Ява в общем, чтобы не учитывать эти моменты при решении других задач. Полезную информацию и урок я получил. Спасибо maytonЛучше (в порядке приоритета): 1) Использовать финансовые вычисления в базе во внутренних (native) типах и выводить результат с использованием JSP. 2) Использовать наибилее близкие wrappers к тем типам денежных величин (ex oracle.jdbc.NUMBER) и выполнять операции непосредственно с ними. 3) Использовать арифметику целых чисел (переводить денежные типы в копейки) и публиковать соотв. с форматированием дробных разрядов. 4) Прочие варианты. Использование символьных вычислений.Огромное спасибо. Уже задумываюсь над третьим вариантом. Его же советовал mikkri. Спасибо ему тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 11:27 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
1) BigDecimal(Double) может давать результаты, отличные от того, что вы ожидаете. Рекомендую использовать только BigDecimal(String), предварительно сконвертировав ваш Double в String. Считайте, что это официальный трюк. 2) Реализация вычислений с дробными числами в Java соответствует стандарту IEEE чего-то там, т.е. неправильными стоит считать языки, где реализация double и float этому стандарту не соответствует. Так что ваше "убеждаюсь, что реализация дробного числа особенная" в корне не верно. 3) Учите мат.часть. Кстати, про денежные вычисления бывает вопросы задают на собеседовании. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 12:47 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Не понимаю почему вы нормально воспринимаете что результат вычисления может быть 5.00000001, но не может быть 4.9999999999 - разница между этими числами всего 0.00000002 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 13:42 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
mikkri1) BigDecimal(Double) может давать результаты, отличные от того, что вы ожидаете. Рекомендую использовать только BigDecimal(String), предварительно сконвертировав ваш Double в String. Считайте, что это официальный трюк.Спасибо mikkri2) Реализация вычислений с дробными числами в Java соответствует стандарту IEEE чего-то там, т.е. неправильными стоит считать языки, где реализация double и float этому стандарту не соответствует. Так что ваше "убеждаюсь, что реализация дробного числа особенная" в корне не верно. 3) Учите мат.часть. Кстати, про денежные вычисления бывает вопросы задают на собеседовании.Ничего против не имею Выходец из HTMLНе понимаю почему вы нормально воспринимаете что результат вычисления может быть 5.00000001, но не может быть 4.9999999999 - разница между этими числами всего 0.00000002Верно. Но я больше хотел сказать о точности после точки. Какая-то минимальная точность должна же существовать? Например, до трех знаков. А тут получаю, что ее совсем нет. Тогда какой смысл в этих вещественных типах? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 14:16 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Semen PopovВерно. Но я больше хотел сказать о точности после точки. Какая-то минимальная точность должна же существовать? Например, до трех знаков. А тут получаю, что ее совсем нет. Тогда какой смысл в этих вещественных типах?Да, и еще замечу, что куча девяток у меня только с double-типом выходила. Изначально был float. Так там вообще девяток не было. Итоговое число было с двумя разрядами после точки. Ничего в глаза не бросалось, но дробная часть была неверной ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 14:43 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Semen PopovДа, и еще замечу, что куча девяток у меня только с double-типом выходила. Изначально был float. Так там вообще девяток не было. Итоговое число было с двумя разрядами после точки. Ничего в глаза не бросалось, но дробная часть была неверной Вместо того чтобы разобратся что же такое float и double ты выбрал скользский путь проб и ошибок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 15:16 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВместо того чтобы разобратся что же такое float и double ты выбрал скользский путь проб и ошибок.Да нет. Просто под влиянием сложившейся у меня практики в других языках, ничего не подозревая, писал. Не думал, что вещественные типы данных в разных языках могут отличаться в этом плане. Но, опять же замечаю за собой минус. Надо было досконально изучить вещественные типы Ява. А на ошибках учатся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 15:43 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Semen PopovНадо было досконально изучить вещественные типы Ява. Вещественные типы почти во всех языках одинаковые (ява не является исключением) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 15:46 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Dan BlackВещественные типы почти во всех языках одинаковые (ява не является исключением)Но, всё же, один и тот же пример (я имею в виду сумму набора чисел с сотыми долями) даёт разный результат ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 16:03 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
авторА на ошибках учатся. Блин парень ты извлек неправильные выводы из этого урока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 16:06 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Пля..... Вместо того чтобы почитать что же такое реально вещественные типы данных, причем не только в Java, и понять свои ошибки(на все это должно уйти по прогнозам не более 3-х часов) сидит на форуме и не по-детски тупит..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 16:08 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
выходец из HTMLПля..... Вместо того чтобы почитать что же такое реально вещественные типы данных, причем не только в Java, и понять свои ошибки(на все это должно уйти по прогнозам не более 3-х часов) сидит на форуме и не по-детски тупит.....Да не напрягайтесь Вы так! Никаких злых умыслов и намерений я за собой не тяну. Спасибо за общение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 16:14 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Сылки по теме http://en.wikipedia.org/wiki/Floating_Point http://en.wikipedia.org/wiki/IEEE_754 http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#28147 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 16:20 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Semen PopovНе думал, что вещественные типы данных в разных языках могут отличаться в этом плане. Блин, ну вот опять о том же. Типы данных не отличаются. Отличается вывод. Java тебя не обманывает и показывает то что есть на самом деле. Другие языки втихаря округляют выводимое значение. http://www.rsdn.ru/forum/message/2404700.aspx Для тех кто абсолютно уверен что в cpp радикально отличаются вещественные типы: http://rsdn.ru/forum/message/943363.aspx или так http://img.meta.ua/rsdnsearch/?q=%EF%EE%E3%F0%E5%F8%ED%EE%F1%F2%FC+double&mode=rank&group=N&group=9 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 16:42 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Semen PopovДа нет. Просто под влиянием сложившейся у меня практики в других языках, ничего не подозревая, писал. Не думал, что вещественные типы данных в разных языках могут отличаться в этом плане. Но, опять же замечаю за собой минус. Надо было досконально изучить вещественные типы Ява. А на ошибках учатся. Могу посоветовать вам кардинально изменить подход к процессу обучения. Поверьте, вам же будет лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 23:43 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
maytonСылки по теме ...Спасибо BlazkowiczБлин, ну вот опять о том же. Типы данных не отличаются. Отличается вывод. Java тебя не обманывает и показывает то что есть на самом деле. Другие языки втихаря округляют выводимое значение. http://www.rsdn.ru/forum/message/2404700.aspxРебят, я понял, что Java не врет. Но, мне от этого не легче. Целью своего сообщения ставил поиск выхода из таких ситуаций. Возникнут задачи, в которых мне нужно будет работать с вещественными типами (5-7 значащих цифр до дробной точки и 3-5 после) и быть уверенным, что получу точный результат (хотя бы при операциях сложения и вычитания). Получил совет - использовать BigDecimal. Спасибо. Ну и пусть другие языки округляют - результат-то я получу тот, который мне нужен. Я не понимаю, почему при сложении 2 разрядов после точки округление выполнять - это неправильно. Оно туда напрашивается. Да, вы мне по-доброму напомнили, как хранятся вещественные типы в памяти, да, операции над ними выполняются с погрешностью, но, опять же, мне нужен результат. В примере я складываю и должен получить результат - десятичную дробь не более 6 значащих цифр до точки и 2 после - всего 8 значащих цифр. Не воспринимайте в штыки, что для меня увиденное удивление, потому что у меня есть другие программы (не на Си), где делаю эти операции и получаю ответ, не зависимо от того, что вещественные типы одинаковы. Только что сварганил пример и перепроверил. Никаких округлений при выводе, вывожу как строку (хотя форматы вывода существуют различные). Там использую тип REAL (объявляет 8-байтовую переменную со знаком в формате с плавающей точкой Intel 8087 (двойной точности), 15 значащих цифр), имеется библиотека двоично-десятичных операций и процедур (Binary Coded Decimal (BCD)), которые выполняются таким же образом как операции десятичной арифметики выполняются на бумаге. В этих операция используются промежуточные значения с точностью до 31 значащих цифр с каждой стороны от десятичной точки. Возможно, еще в этом отличие. BlazkowiczДля тех кто абсолютно уверен что в cpp радикально отличаются вещественные типы: http://rsdn.ru/forum/message/943363.aspx или так http://img.meta.ua/rsdnsearch/?q=%EF%EE%E3%F0%E5%F8%ED%EE%F1%F2%FC+double&mode=rank&group=N&group=9Понятно. Я не настаиваю. LeonidvМогу посоветовать вам кардинально изменить подход к процессу обучения. Поверьте, вам же будет лучше.Согласен PS. Ребят, вы мне все доказали. Я не опровергаю ваши утверждения. Не хочу разводить спор. Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 11:50 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Semen PopovРебят, я понял, что Java не врет. Но, мне от этого не легче. Целью своего сообщения ставил поиск выхода из таких ситуаций. Возникнут задачи, в которых мне нужно будет работать с вещественными типами (5-7 значащих цифр до дробной точки и 3-5 после) и быть уверенным, что получу точный результат (хотя бы при операциях сложения и вычитания). Получил совет - использовать BigDecimal. Спасибо. Ну и пусть другие языки округляют - результат-то я получу тот, который мне нужен. Я не понимаю, почему при сложении 2 разрядов после точки округление выполнять - это неправильно. Оно туда напрашивается. Да, вы мне по-доброму напомнили, как хранятся вещественные типы в памяти, да, операции над ними выполняются с погрешностью, но, опять же, мне нужен результат. В примере я складываю и должен получить результат - десятичную дробь не более 6 значащих цифр до точки и 2 после - всего 8 значащих цифр. Не воспринимайте в штыки, что для меня увиденное удивление, потому что у меня есть другие программы (не на Си), где делаю эти операции и получаю ответ, не зависимо от того, что вещественные типы одинаковы. Только что сварганил пример и перепроверил. Никаких округлений при выводе, вывожу как строку (хотя форматы вывода существуют различные). Там использую тип REAL (объявляет 8-байтовую переменную со знаком в формате с плавающей точкой Intel 8087 (двойной точности), 15 значащих цифр), имеется библиотека двоично-десятичных операций и процедур (Binary Coded Decimal (BCD)), которые выполняются таким же образом как операции десятичной арифметики выполняются на бумаге. В этих операция используются промежуточные значения с точностью до 31 значащих цифр с каждой стороны от десятичной точки. Возможно, еще в этом отличие.Привет! прикол в том, что Java разработана с заточкой под защиту от "тупых кодеров". Переведу на русский: вместо того, чтобы разрешить программисту опасную операцию Java ее запрещает. Это как в С можно обратиться по не инициализированному указателю, но в Java подобное не допустимо. Так же и в этом варианте Java выдает КАК МОЖНО БОЛЬШЕ ошибок на этапе компиляции и разработки. к примеру на иных языках программирования на "малых" знаках точности округления может хватать и результат будет совпадать с нужным. Но если вдруг исходные данные превысят предел точности округления, то в ПО пРоявится ошибка. В отличие от этого подхода Java выдает "ошибку" сразу (в том смысле, что не скрывает от программиста свои данные). Потому с позиции программиста - да, это не удобно и было бы лучше получить округление. Тем более оно пока подходит. Но с точки зрения менеджера - нужно получить ошибку как можно раньше, ибо стоимость исправления ошибки растет по экспоненте . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2008, 15:54 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Языки программирования для того и придуманы, чтобы программист мог абстрагироваться от физического чисел. А java вечно заставляет думать о форматах всяких. В общем, своих функций не оправдывает. Вы вообще представляете, сколько надо сложить чисел двумя разрядами после запятой чтобы получить переполнение разрядной сетки? 2 в 27-ой степени! Это 1000000000! Миллиард! А если число хранится в экспотенциальной форме, то его отномительная погрешность не должна преввшать младшего разряда мантисы! Если на java пишут финансовые приложения, то я понимаю, почему финансовый коллапс неизбежен. Могу предположить, что после этого поста меня обвинят в дилетантстве, незнании основ, и прочих смертных грехах. Потому что ни один из примутствующих здесь java-програмиистов в ответ на вполне естественный вопрос так и не предложил своего решения проблемы (извините, но советы читать докумментацию и использовать BigDecimal я не могу назвать конструктивными). Невооруженным глазом видно, что решения вопроса никто не знает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2015, 02:11 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
полегчало? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2015, 04:38 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
GardonehЯзыки программирования для того и придуманы, чтобы программист мог абстрагироваться от физического чисел. А java вечно заставляет думать о форматах всяких. В общем, своих функций не оправдывает. Увы, это справедливо для любой реализации ЯП. Архитектура Фонеймана накладывает ограничения. А так "Алгоритмический язык" по определению должен реализовывать числовые типы с соответствии с их математическим определением. Но его верной реализации до сих пор нет. :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2015, 06:37 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
GardonehЕсли на java пишут финансовые приложения, то я понимаю, почему финансовый коллапс неизбежен. Если на любом ЯП при разработке финансовых приложений используют числа с плавающей точкой- то финансовый коллапс неизбежен. Числа с фиксированной точкой, очень неудобные для процессора, не просто так придуманы и включены во многие ЯП (Ada вроде первой была), включая java. То, что некоторые программисты умудряются не знать этого даже к окончанию института- позор нашего образования, не отсеивающего идиотов на младших курсах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2015, 08:57 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=35345259&tid=2125957]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
411ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
78ms |
get tp. blocked users: |
2ms |
| others: | 218ms |
| total: | 753ms |

| 0 / 0 |
