Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Чудеса от float и double / 25 сообщений из 49, страница 1 из 2
29.05.2008, 16:52
    #35343794
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса от float и double
Здравствуйте всем!

Вот такие для себя чудеса обнаружил.
В JSP существует jsp:usebean - массив объектов c дробными значениями (float или double, суть не меняется), например - 2156.1, 23.11, 45689.8, .... 2345.5. Значения c дробной частью не более двух знаков. Суммирую значения в цикле, показываю. И удивляюсь! Итоговая сумма в дробной части не сходится! Если применяю double-тип, то вообще страшные цифры лезут - 23456.499999.
Это так положено или что-то я не так сделал? Можно ли в JSP проводить вычисления?

С уважением, Семен Попов
...
Рейтинг: 0 / 0
29.05.2008, 17:05
    #35343846
askme
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса от float и double
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.
...
Рейтинг: 0 / 0
29.05.2008, 17:06
    #35343855
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса от float и double
Semen PopovИтоговая сумма в дробной части не сходится!Каким образом ты это смог проверить? С чем сравнивал?
...
Рейтинг: 0 / 0
29.05.2008, 17:10
    #35343865
mikkri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса от float и double
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 в такой ситуации. Но с ним тоже нужно быть аккуратным.
...
Рейтинг: 0 / 0
29.05.2008, 17:33
    #35343960
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса от float и double
Вот примерно, что делаю:
Код: 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.
<BODY>
...
<jsp:useBean id="reprslt"  class ="com.pfrkomi.penstransit.domain.SelectResponse" scope="request"/>
<% 
    double  Totals = 0 ;
    double  DoubleVar= 0 ;
    short  Counter= 0 ;
...
%>
<DIV align="center">
<TABLE cellpadding="1" cellspacing="0">
...
<TBODY>
<c_rt:forEach var="row" items="<%=reprslt.rows%>">
 <%ArrayList row = (ArrayList)pageContext.getAttribute("row"); 
   Counter++; 
   DoubleVar=((Number)row.get("Field")).doubleValue();
   Totals+=DoubleVar; %>
 <TR> 
  <TD align="right"><%=DoubleVar%></TD>
 </TR>
</c_rt:forEach>
 </TBODY>
 <TFOOT>
  <TR style="text-align:center">
   <TD colspan="2" align="left">Итого:</TD>
   <TD>X</TD>
   <TD>X</TD>
   <TD>X</TD>
   <TD>X</TD>
   <TD>X</TD>
   <TD>X</TD>
   <TD align="right"><%=Totals%></TD>
...
В итоге в ячейках, куда вывожу DoubleVar значение нормальное, а итоговое Totals с кучей девяток в дробной части. И как это получилось?

Иногда удобно некоторые результаты просчитать в JSP, чем это отдавать на откуп БД ли DAO. А вот с этим столкнулся, и теперь в замешательстве
...
Рейтинг: 0 / 0
29.05.2008, 17:54
    #35344047
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса от float и double
Semen PopovВ JSP существует jsp:usebean - массив объектов c дробными значениями (float или double, суть не меняется), например - 2156.1, 23.11, 45689.8, .... 2345.5. Значения c дробной частью не более двух знаков. Суммирую значения в цикле, показываю. И удивляюсь! Итоговая сумма в дробной части не сходится! Если применяю double-тип, то вообще страшные цифры лезут - 23456.499999.
Это так положено или что-то я не так сделал? Можно ли в JSP проводить вычисления?

Чудеса они для тех кто не знает как десятичные дроби хранятся в double и float.
...
Рейтинг: 0 / 0
29.05.2008, 19:08
    #35344277
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса от float и double
BlazkowiczЧудеса они для тех кто не знает как десятичные дроби хранятся в double и float.Ребят, вы меня извините, но, я выходец из Си, Кларион, не из таких крутых языков, где совсем не парился насчет точности при работе с такими типами, если конечно, не приходилось вычислять с точностью до 500 знаков после запятой! Но, я уж никак не мог предположить, что Ява 2 знака после запятой сложить не сможет. Или не так?
...
Рейтинг: 0 / 0
29.05.2008, 19:19
    #35344289
Чудеса от float и double
Вам же сказали - почитайте как устроены типы флоат дабл в Java - тогда вопросы отпадут, попутно надо будет листануть учебник по информатике - устройство бита-байта и тд. Занятного чтения
...
Рейтинг: 0 / 0
29.05.2008, 19:27
    #35344303
Dan Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса от float и double
Semen PopovРебят, вы меня извините, но, я выходец из Си , Кларион, не из таких крутых языков, где совсем не парился насчет точности при работе с такими типами, если конечно, не приходилось вычислять с точностью до 500 знаков после запятой! Но, я уж никак не мог предположить, что Ява 2 знака после запятой сложить не сможет. Или не так?Могу предположить, что Си Вы изучали самостоятельно, а не в институте, потому что Ваш случай на втором занятии проходят при изучении вещественных типов.
...
Рейтинг: 0 / 0
29.05.2008, 19:35
    #35344316
Чудеса от float и double
Чорт, на HTML это проходят на 5 занятии, мой кореш Вася был прав - Си круче
...
Рейтинг: 0 / 0
29.05.2008, 19:38
    #35344322
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса от float и double
Semen PopovРебят, вы меня извините, но, я выходец из Си, Кларион, не из таких крутых языков, где совсем не парился насчет точности при работе с такими типами, если конечно, не приходилось вычислять с точностью до 500 знаков после запятой! Но, я уж никак не мог предположить, что Ява 2 знака после запятой сложить не сможет. Или не так?
Ага, в C++ printf за тебя все округления делает. Был один такой в rsdn.ru:java доказывал что поэтому C++ круче Java.
Лично я с институской скамьи помню. Что:

не все десятичные дроби имеют конечное представление в двоичном виде

Очень простое высказывание очень четко характирезующее проблему.
...
Рейтинг: 0 / 0
29.05.2008, 19:45
    #35344333
Чудеса от float и double
Сишничек запусти ка такой примерчик
public static void main(String args[]){
double d = 0d;
for(int i=0; i<10;i++){
d+=0.1
}
System.out.println(d);
}
И иди рассказывай что жаба - говно)
...
Рейтинг: 0 / 0
29.05.2008, 20:10
    #35344369
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса от float и double
Выходец из HTMLИ иди рассказывай что жаба - говно)А я и не преследовал этих целей. Для себя не такие цели ставлю. Хочу овладеть Ява. И что с этого? То, что я сишник, кларионщик, я богу неугодный? Хочу понять, возможно, неопытный. Сравнил два варианта. В жизни своей программистской не встречал подобных ситуаций. Си я как раз изучал только в универе, курсовые и диплом и остальное. Кларион - это преследователь Си. Не хочу ничего возвышать! Еще раз, в простой ситуации, почему Ява (параллельно у меня куча прог на Clarion выполняют подобные действия) не считает 2 знака после запятой? Для меня даже не это так сильно важно. Для меня важно, как это обойти. Я решаю задачи, а не занимаюсь возвышением и перечислением преимуществ отдельных языков.
...
Рейтинг: 0 / 0
29.05.2008, 20:13
    #35344374
mikkri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса от float и double
Semen Popov Выходец из HTMLИ иди рассказывай что жаба - говно)А я и не преследовал этих целей. Для себя не такие цели ставлю. Хочу овладеть Ява. И что с этого? То, что я сишник, кларионщик, я богу неугодный? Хочу понять, возможно, неопытный. Сравнил два варианта. В жизни своей программистской не встречал подобных ситуаций. Си я как раз изучал только в универе, курсовые и диплом и остальное. Кларион - это преследователь Си. Не хочу ничего возвышать! Еще раз, в простой ситуации, почему Ява (параллельно у меня куча прог на Clarion выполняют подобные действия) не считает 2 знака после запятой? Для меня даже не это так сильно важно. Для меня важно, как это обойти. Я решаю задачи, а не занимаюсь возвышением и перечислением преимуществ отдельных языков.
Я ж вам уже написал, что если нужно делать точные вычисления с десятичными дробями используйте тип BigDecimal.
...
Рейтинг: 0 / 0
29.05.2008, 20:20
    #35344382
Чудеса от float и double
На пальцах - double - 32 бита, в него может влезть всего лишь 2 в 32 степени различных чисел. Всего чисел как вы я думаю можете понять - бесконечное множество - поэтому во ВСЕХ языках программирования имеется всего лишь абстракция дробного числа - поэтому в результате вычислений получается немного не то что мы ожидали иногда. А то что вы на си печатали числа с нужным округлением - то это совсем не значит - что в памяти они представлялись также как и печатались. Решение проблемы - используйте класс BigDecimal
...
Рейтинг: 0 / 0
29.05.2008, 20:20
    #35344384
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса от float и double
mikkriЯ ж вам уже написал, что если нужно делать точные вычисления с десятичными дробями используйте тип BigDecimal.Спасибо. Но и там Вы сказали, что это не совершенный вариант. Поэтому не так сильно на это обратил внимание. Как всегда, хотел найти некое универсальное решение. Но, наверно, в моем случае это подойдет. Еще раз спасибо.
...
Рейтинг: 0 / 0
29.05.2008, 20:38
    #35344413
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса от float и double
выходец из HTMLНа пальцах - double - 32 бита, в него может влезть всего лишь 2 в 32 степени различных чисел. Всего чисел как вы я думаю можете понять - бесконечное множество - поэтому во ВСЕХ языках программирования имеется всего лишь абстракция дробного числа - поэтому в результате вычислений получается немного не то что мы ожидали иногда. А то что вы на си печатали числа с нужным округлением - то это совсем не значит - что в памяти они представлялись также как и печатались. Решение проблемы - используйте класс BigDecimalНе надо мне объяснять, какие типы сколько занимают. Это в книжке не мало написано. Наизусть знаем. Вопрос в другом. Причем тут округлени на Си? Я как раз задавал точное количество знаков после запятой, 2-3 максимум(больше мне не надо было), и получал точный результат. Сомнений не было. Понятно, что реализация дробных чисел разная, но почему 2 знака не устроили? Какие могут быть особенные манипуляции с дробными числами в дробной части, если у языка требуется сложить сотые доли, а он дает неверный результат?
...
Рейтинг: 0 / 0
29.05.2008, 20:47
    #35344421
Dan Black
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса от float и double
язык даёт верный ответ, это вот Вы даёте ему неверные исходные данные
задавая 0,7 в коде программы, вы реально задаёте число 0.69999999999999996 т.д.
Складывая очень много подобных чисел, Вы получаете уже заметную погрешность

Код: plaintext
1.
----------------------------
 Verba volent, scripta manent 
...
Рейтинг: 0 / 0
29.05.2008, 20:51
    #35344425
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса от float и double
Dan Blackязык даёт верный ответ, это вот Вы даёте ему неверные исходные данные
задавая 0,7 в коде программы, вы реально задаёте число 0.69999999999999996 т.д.
Складывая очень много подобных чисел, Вы получаете уже заметную погрешностьА я не задаю. Я всего лишь рассчитываю в JSP сумму тех элементов, которую мне вернул DAO. Я ж привел пример. Вы мне расскажите, прежде чем судить, что я не так сделал?
...
Рейтинг: 0 / 0
29.05.2008, 21:03
    #35344437
mikkri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса от float и double
Semen Popov mikkriЯ ж вам уже написал, что если нужно делать точные вычисления с десятичными дробями используйте тип BigDecimal.Спасибо. Но и там Вы сказали, что это не совершенный вариант. Поэтому не так сильно на это обратил внимание. Как всегда, хотел найти некое универсальное решение. Но, наверно, в моем случае это подойдет. Еще раз спасибо.
А вам так сразу совершенный подавать? Еще вариант - использовать вычисления с целыми числами. Т.е. порешите что все деньги, к примеру, у вас в копейках, а дробных копеек вы не поддерживаете.
...
Рейтинг: 0 / 0
29.05.2008, 21:07
    #35344441
Чудеса от float и double
млйа вот код который вам поможет
public static void main(String args[]){
if(!(readDocumentationJava() && readInformaticBasics()){
killYourselfOnWall();
}else{
continueProgrammingOnClarion();
}
}
...
Рейтинг: 0 / 0
29.05.2008, 21:09
    #35344442
Чудеса от float и double
mikkri - кому вы обьясняете - ентому мусчине я бы не только вычисления денег не доверил - стоять рядом с калькулятором запретил бы
...
Рейтинг: 0 / 0
29.05.2008, 21:30
    #35344459
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса от float и double
Выходец из HTMLмлйа вот код который вам поможет
public static void main(String args[]){
if(!(readDocumentationJava() && readInformaticBasics()){
killYourselfOnWall();
}else{
continueProgrammingOnClarion();
}
}Еще раз, прежде,чем судить, объясните корректно неучу, что не так сделал? На крутые высказывания и я горазд. Я не выдвигаю свое предположение одним из постулатов. А дело не только в деньгах! Я знаю, что деньги в приложении не так надо хранить. Я хочу понять, почему мое решение неправильное, и хотел бы увидеть решение. А не обсуждать, насколько все такие, язык такой, а остальные - прелесть
...
Рейтинг: 0 / 0
30.05.2008, 09:45
    #35344859
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса от float и double
Вот решение. Правильно ли это?
Код: 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.
<BODY>
...
<jsp:useBean id="reprslt"  class ="com.pfrkomi.penstransit.domain.SelectResponse" scope="request"/>
<% 
   BigDecimal Totals =  new  BigDecimal( 0 );
    double  DoubleVar= 0 ;
    short  Counter= 0 ;
...
%>
<DIV align="center">
<TABLE cellpadding="1" cellspacing="0">
...
<TBODY>
<c_rt:forEach var="row" items="<%=reprslt.rows%>">
 <%ArrayList row = (ArrayList)pageContext.getAttribute("row"); 
   Counter++; 
   DoubleVar=((Number)row.get("Field")).doubleValue();
   Totals=Totals.add( new  BigDecimal(DoubleVar)); %>
 <TR> 
  <TD align="right"><%=DoubleVar%></TD>
 </TR>
</c_rt:forEach>
 </TBODY>
 <TFOOT>
  <TR style="text-align:center">
   <TD colspan="2" align="left">Итого:</TD>
   <TD>X</TD>
   <TD>X</TD>
   <TD>X</TD>
   <TD>X</TD>
   <TD>X</TD>
   <TD>X</TD>
   <TD align="right"><%=Totals.doubleValue()%></TD>
...
Есть сомнения над тем, что я делаю в цикле. Возможно, это можно еще упростить
...
Рейтинг: 0 / 0
30.05.2008, 10:29
    #35344999
Самоловских Виталий aka Kefir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чудеса от float и double
Настоятельно рекомендую:
1. Прочитать книгу начального уровня про Java
2. Прочитать книгу Брюса Тейта "Горький вкус Java" ("Bitter Java")
3. Посетить сайт http://www.skipy.ru/

По вашему, коду: может он и работает, но там все неправильно. Начиная от именования переменных и заканчивая вычислениями в JSP.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Чудеса от float и double / 25 сообщений из 49, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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