Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> глюк с числами с плав. запятой, неточности во время сложения 
:(
    Опции темы
ZAVS
Дата 19.11.2004, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 25.2.2004
Где: ЕРЕВАН

Репутация: нет
Всего: 1



привет Всем

вот кусок программы
Код


[code=java]
  double a=0;
   double b=0.2;
   
   for(int i=0;i<=30;i++){
     ++a;
     if(i%3==0){
       a+=b;
     }
     System.out.println("a"+i+": "+a);
   }



а вот результат

Цитата

a0: 1.2
a1: 2.2
a2: 3.2
a3: 4.4
a4: 5.4
a5: 6.4
a6: 7.6000000000000005
a7: 8.600000000000001
a8: 9.600000000000001
a9: 10.8
a10: 11.8
a11: 12.8
a12: 14.0
a13: 15.0
a14: 16.0
a15: 17.2
a16: 18.2
a17: 19.2
a18: 20.4
a19: 21.4
a20: 22.4
a21: 23.599999999999998
a22: 24.599999999999998
a23: 25.599999999999998
a24: 26.799999999999997
a25: 27.799999999999997
a26: 28.799999999999997
a27: 29.999999999999996
a28: 30.999999999999996
a29: 31.999999999999996
a30: 33.2



кто может обяснить от чего это происходит (может в sun-е что то упустили)??
и как от этого избавиться????
--------------------
Учись студент доцентом станешь :)
PM MAIL ICQ   Вверх
Domestic Cat
Дата 19.11.2004, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Почитай кak флоат типы хранятся в памяти smile это самая обычная вещь для любогo языка.


--------------------

PM   Вверх
cardinal
Дата 19.11.2004, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



Цитата(ZAVS @ 18.11.2004, 23:02)
и как от этого избавиться????

округлить результаты или сделать так:
Код

 double a=0;
  double b=2;
 
  for(int i=0;i<=300;i+=10){
    a+=10;
    if(i%30==0){
      a+=b;
    }
    System.out.println("a"+i/10+": "+a/10);
  }



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Domestic Cat
Дата 19.11.2004, 03:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



чтобы еще больше понять насколько плохой язык Java(шутка), можно запустить такую прогу:

Код

public class Test
{
  public static void main(String [] args)
  {
      float a = 1296856321;
      long b = 1296856301;
      long c = 1296856308;
      if (a == b) System.out.println("a==b");
      if (c == b) System.out.println("c==b");
  }
}



--------------------

PM   Вверх
ElectricalStorm
Дата 19.11.2004, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: 5
Всего: 9



тут при неявном касте присравнении
if (a == (float)b)

a = 1.29685632E9
b = 1.29685632E9

получается что они равны...;)



--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
sergejzr
Дата 20.11.2004, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 6
Всего: 360



Кстати в цитате видно, как ошибки распределяются smile Чем больше числа, тем неточнее флоат smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
ZAVS
Дата 20.11.2004, 04:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 25.2.2004
Где: ЕРЕВАН

Репутация: нет
Всего: 1



спасибо

Цитата(cardinal @ 19.11.2004, 01:39)
double a=0;
  double b=2;
 
  for(int i=0;i<=300;i+=10){
    a+=10;
    if(i%30==0){
      a+=b;
    }
    System.out.println("a"+i/10+": "+a/10);
  }




а кроме этого есть какой-то универсальный метод который позволяет избежать неточностей smile

--------------------
Учись студент доцентом станешь :)
PM MAIL ICQ   Вверх
cardinal
Дата 20.11.2004, 04:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



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


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Domestic Cat
Дата 20.11.2004, 04:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Ну если уж очень нузна такая точность, посмотри класс BigDecimal

http://java.sun.com/j2se/1.4.2/docs/api/ja...BigDecimal.html
Добавлено @ 04:57
Пример:

Код


   BigDecimal bd1 = new BigDecimal("123456789.0123456890");
   
   BigDecimal bd2 = BigDecimal.valueOf(123L);
   
   bd1 = bd1.add(bd2);
   bd1 = bd1.multiply(bd2);
   bd1 = bd1.subtract(bd2);
   bd1 = bd1.divide(bd2, BigDecimal.ROUND_UP);
   bd1 = bd1.negate();




--------------------

PM   Вверх
Zandr
Дата 23.11.2004, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 433
Регистрация: 16.7.2004
Где: Новосибирск

Репутация: 9
Всего: 13



Ага java.math.BigInteger - целые, java.math.BigDecimal - вещественные, неограниченной точности.
Только расплата за это - скорость.


Это сообщение отредактировал(а) Zandr - 23.11.2004, 08:37
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0549 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.