|
|
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Здравствуйте всем! Вот такие для себя чудеса обнаружил. В JSP существует jsp:usebean - массив объектов c дробными значениями (float или double, суть не меняется), например - 2156.1, 23.11, 45689.8, .... 2345.5. Значения c дробной частью не более двух знаков. Суммирую значения в цикле, показываю. И удивляюсь! Итоговая сумма в дробной части не сходится! Если применяю double-тип, то вообще страшные цифры лезут - 23456.499999. Это так положено или что-то я не так сделал? Можно ли в JSP проводить вычисления? С уважением, Семен Попов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 16:52 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Semen PopovЗдравствуйте всем! Вот такие для себя чудеса обнаружил. В JSP существует jsp:usebean - массив объектов c дробными значениями (float или double, суть не меняется), например - 2156.1, 23.11, 45689.8, .... 2345.5. Значения c дробной частью не более двух знаков. Суммирую значения в цикле, показываю. И удивляюсь! Итоговая сумма в дробной части не сходится! Если применяю double-тип, то вообще страшные цифры лезут - 23456.499999. Это так положено или что-то я не так сделал? Можно ли в JSP проводить вычисления? С уважением, Семен Попов можно. see Java Language Reference float + float = double. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 17:05 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Semen PopovИтоговая сумма в дробной части не сходится!Каким образом ты это смог проверить? С чем сравнивал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 17:06 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Semen PopovЗдравствуйте всем! Вот такие для себя чудеса обнаружил. В JSP существует jsp:usebean - массив объектов c дробными значениями (float или double, суть не меняется), например - 2156.1, 23.11, 45689.8, .... 2345.5. Значения c дробной частью не более двух знаков. Суммирую значения в цикле, показываю. И удивляюсь! Итоговая сумма в дробной части не сходится! Если применяю double-тип, то вообще страшные цифры лезут - 23456.499999. Это так положено или что-то я не так сделал? Можно ли в JSP проводить вычисления? С уважением, Семен Попов 1) это так положено (особенность типов float и double, JSP тут ни при чем) 2) в JSP вычисления делать можно, но лучше не стоит Многие рекомендуют использовать BigNumber в такой ситуации. Но с ним тоже нужно быть аккуратным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 17:10 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Вот примерно, что делаю: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. Иногда удобно некоторые результаты просчитать в JSP, чем это отдавать на откуп БД ли DAO. А вот с этим столкнулся, и теперь в замешательстве ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 17:33 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Semen PopovВ JSP существует jsp:usebean - массив объектов c дробными значениями (float или double, суть не меняется), например - 2156.1, 23.11, 45689.8, .... 2345.5. Значения c дробной частью не более двух знаков. Суммирую значения в цикле, показываю. И удивляюсь! Итоговая сумма в дробной части не сходится! Если применяю double-тип, то вообще страшные цифры лезут - 23456.499999. Это так положено или что-то я не так сделал? Можно ли в JSP проводить вычисления? Чудеса они для тех кто не знает как десятичные дроби хранятся в double и float. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 17:54 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
BlazkowiczЧудеса они для тех кто не знает как десятичные дроби хранятся в double и float.Ребят, вы меня извините, но, я выходец из Си, Кларион, не из таких крутых языков, где совсем не парился насчет точности при работе с такими типами, если конечно, не приходилось вычислять с точностью до 500 знаков после запятой! Но, я уж никак не мог предположить, что Ява 2 знака после запятой сложить не сможет. Или не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 19:08 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Вам же сказали - почитайте как устроены типы флоат дабл в Java - тогда вопросы отпадут, попутно надо будет листануть учебник по информатике - устройство бита-байта и тд. Занятного чтения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 19:19 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Semen PopovРебят, вы меня извините, но, я выходец из Си , Кларион, не из таких крутых языков, где совсем не парился насчет точности при работе с такими типами, если конечно, не приходилось вычислять с точностью до 500 знаков после запятой! Но, я уж никак не мог предположить, что Ява 2 знака после запятой сложить не сможет. Или не так?Могу предположить, что Си Вы изучали самостоятельно, а не в институте, потому что Ваш случай на втором занятии проходят при изучении вещественных типов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 19:27 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Чорт, на HTML это проходят на 5 занятии, мой кореш Вася был прав - Си круче ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 19:35 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Semen PopovРебят, вы меня извините, но, я выходец из Си, Кларион, не из таких крутых языков, где совсем не парился насчет точности при работе с такими типами, если конечно, не приходилось вычислять с точностью до 500 знаков после запятой! Но, я уж никак не мог предположить, что Ява 2 знака после запятой сложить не сможет. Или не так? Ага, в C++ printf за тебя все округления делает. Был один такой в rsdn.ru:java доказывал что поэтому C++ круче Java. Лично я с институской скамьи помню. Что: не все десятичные дроби имеют конечное представление в двоичном виде Очень простое высказывание очень четко характирезующее проблему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 19:38 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Сишничек запусти ка такой примерчик public static void main(String args[]){ double d = 0d; for(int i=0; i<10;i++){ d+=0.1 } System.out.println(d); } И иди рассказывай что жаба - говно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 19:45 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Выходец из HTMLИ иди рассказывай что жаба - говно)А я и не преследовал этих целей. Для себя не такие цели ставлю. Хочу овладеть Ява. И что с этого? То, что я сишник, кларионщик, я богу неугодный? Хочу понять, возможно, неопытный. Сравнил два варианта. В жизни своей программистской не встречал подобных ситуаций. Си я как раз изучал только в универе, курсовые и диплом и остальное. Кларион - это преследователь Си. Не хочу ничего возвышать! Еще раз, в простой ситуации, почему Ява (параллельно у меня куча прог на Clarion выполняют подобные действия) не считает 2 знака после запятой? Для меня даже не это так сильно важно. Для меня важно, как это обойти. Я решаю задачи, а не занимаюсь возвышением и перечислением преимуществ отдельных языков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 20:10 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Semen Popov Выходец из HTMLИ иди рассказывай что жаба - говно)А я и не преследовал этих целей. Для себя не такие цели ставлю. Хочу овладеть Ява. И что с этого? То, что я сишник, кларионщик, я богу неугодный? Хочу понять, возможно, неопытный. Сравнил два варианта. В жизни своей программистской не встречал подобных ситуаций. Си я как раз изучал только в универе, курсовые и диплом и остальное. Кларион - это преследователь Си. Не хочу ничего возвышать! Еще раз, в простой ситуации, почему Ява (параллельно у меня куча прог на Clarion выполняют подобные действия) не считает 2 знака после запятой? Для меня даже не это так сильно важно. Для меня важно, как это обойти. Я решаю задачи, а не занимаюсь возвышением и перечислением преимуществ отдельных языков. Я ж вам уже написал, что если нужно делать точные вычисления с десятичными дробями используйте тип BigDecimal. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 20:13 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
На пальцах - double - 32 бита, в него может влезть всего лишь 2 в 32 степени различных чисел. Всего чисел как вы я думаю можете понять - бесконечное множество - поэтому во ВСЕХ языках программирования имеется всего лишь абстракция дробного числа - поэтому в результате вычислений получается немного не то что мы ожидали иногда. А то что вы на си печатали числа с нужным округлением - то это совсем не значит - что в памяти они представлялись также как и печатались. Решение проблемы - используйте класс BigDecimal ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 20:20 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
mikkriЯ ж вам уже написал, что если нужно делать точные вычисления с десятичными дробями используйте тип BigDecimal.Спасибо. Но и там Вы сказали, что это не совершенный вариант. Поэтому не так сильно на это обратил внимание. Как всегда, хотел найти некое универсальное решение. Но, наверно, в моем случае это подойдет. Еще раз спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 20:20 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
выходец из HTMLНа пальцах - double - 32 бита, в него может влезть всего лишь 2 в 32 степени различных чисел. Всего чисел как вы я думаю можете понять - бесконечное множество - поэтому во ВСЕХ языках программирования имеется всего лишь абстракция дробного числа - поэтому в результате вычислений получается немного не то что мы ожидали иногда. А то что вы на си печатали числа с нужным округлением - то это совсем не значит - что в памяти они представлялись также как и печатались. Решение проблемы - используйте класс BigDecimalНе надо мне объяснять, какие типы сколько занимают. Это в книжке не мало написано. Наизусть знаем. Вопрос в другом. Причем тут округлени на Си? Я как раз задавал точное количество знаков после запятой, 2-3 максимум(больше мне не надо было), и получал точный результат. Сомнений не было. Понятно, что реализация дробных чисел разная, но почему 2 знака не устроили? Какие могут быть особенные манипуляции с дробными числами в дробной части, если у языка требуется сложить сотые доли, а он дает неверный результат? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 20:38 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
язык даёт верный ответ, это вот Вы даёте ему неверные исходные данные задавая 0,7 в коде программы, вы реально задаёте число 0.69999999999999996 т.д. Складывая очень много подобных чисел, Вы получаете уже заметную погрешность Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 20:47 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Dan Blackязык даёт верный ответ, это вот Вы даёте ему неверные исходные данные задавая 0,7 в коде программы, вы реально задаёте число 0.69999999999999996 т.д. Складывая очень много подобных чисел, Вы получаете уже заметную погрешностьА я не задаю. Я всего лишь рассчитываю в JSP сумму тех элементов, которую мне вернул DAO. Я ж привел пример. Вы мне расскажите, прежде чем судить, что я не так сделал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 20:51 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Semen Popov mikkriЯ ж вам уже написал, что если нужно делать точные вычисления с десятичными дробями используйте тип BigDecimal.Спасибо. Но и там Вы сказали, что это не совершенный вариант. Поэтому не так сильно на это обратил внимание. Как всегда, хотел найти некое универсальное решение. Но, наверно, в моем случае это подойдет. Еще раз спасибо. А вам так сразу совершенный подавать? Еще вариант - использовать вычисления с целыми числами. Т.е. порешите что все деньги, к примеру, у вас в копейках, а дробных копеек вы не поддерживаете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 21:03 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
млйа вот код который вам поможет public static void main(String args[]){ if(!(readDocumentationJava() && readInformaticBasics()){ killYourselfOnWall(); }else{ continueProgrammingOnClarion(); } } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 21:07 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
mikkri - кому вы обьясняете - ентому мусчине я бы не только вычисления денег не доверил - стоять рядом с калькулятором запретил бы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 21:09 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Выходец из HTMLмлйа вот код который вам поможет public static void main(String args[]){ if(!(readDocumentationJava() && readInformaticBasics()){ killYourselfOnWall(); }else{ continueProgrammingOnClarion(); } }Еще раз, прежде,чем судить, объясните корректно неучу, что не так сделал? На крутые высказывания и я горазд. Я не выдвигаю свое предположение одним из постулатов. А дело не только в деньгах! Я знаю, что деньги в приложении не так надо хранить. Я хочу понять, почему мое решение неправильное, и хотел бы увидеть решение. А не обсуждать, насколько все такие, язык такой, а остальные - прелесть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2008, 21:30 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Вот решение. Правильно ли это? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 09:45 |
|
||
|
Чудеса от float и double
|
|||
|---|---|---|---|
|
#18+
Настоятельно рекомендую: 1. Прочитать книгу начального уровня про Java 2. Прочитать книгу Брюса Тейта "Горький вкус Java" ("Bitter Java") 3. Посетить сайт http://www.skipy.ru/ По вашему, коду: может он и работает, но там все неправильно. Начиная от именования переменных и заканчивая вычислениями в JSP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2008, 10:29 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=35344303&tid=2125957]: |
0ms |
get settings: |
5ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
396ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 707ms |

| 0 / 0 |
