Автор Тема: Почему 1.9-1.89= 0.00999999999930878  (Прочитано 5688 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн joymix

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 11
  • +0/-0
  • 0
    • Просмотр профиля
    • http://inform.sir.edu
Почему 1.9-1.89= 0.00999999999930878
« : 10 Мая 2006, 00:15:20 »
Люди, у меня прям депрессия!
вычитаю на перле
my $i1 =4902.89;
my $i2=4902.9;
print $i2-$i1;
получаю какую-то байду. 0.00999999999930878
Что это и как поправить вычиталку?
Но при вычитании 0.9-0.89 все работает.
нужен хелп! Спасайте, теряю веру в математику. :)

Оффлайн joymix

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 11
  • +0/-0
  • 0
    • Просмотр профиля
    • http://inform.sir.edu
Почему 1.9-1.89= 0.00999999999930878
« Ответ #1 : 10 Мая 2006, 00:50:09 »
Тут подсказали, оказывается, в двочном формате 0.01 = 0.009(9), но кто скажет, как привести это к "традиционной" математике.

Оффлайн frenky

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 171
  • +0/-0
  • 0
    • Просмотр профиля
    • http://fdm.kiev.ua
Почему 1.9-1.89= 0.00999999999930878
« Ответ #2 : 10 Мая 2006, 01:07:53 »
а ты домнож на 100 отнеми а потом подели
____________________
[on-line football manager] fdm.kiev.ua

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Почему 1.9-1.89= 0.00999999999930878
« Ответ #3 : 10 Мая 2006, 01:25:44 »
perldoc -f printf

Оффлайн joymix

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 11
  • +0/-0
  • 0
    • Просмотр профиля
    • http://inform.sir.edu
Почему 1.9-1.89= 0.00999999999930878
« Ответ #4 : 10 Мая 2006, 01:37:36 »
Frenky: Не команду int я тоже знаю.
Arto:  printf - это скалярный вывод, он просто обрежет знаки и выведет по формату. тож не совсем то.
Сейчас я кое-как выкрутился - действительно помножил и поделил, но не на 100, а на 1000. Проблема в том, а что будет если завтра там столкнутся не сотые, а тысячные или миллионные доли? Нельзя же все время таким драконовским методом приводить 0.0(9) r 0.1
Может есть какой-нибудь универсальный способ что-нибудь сказать перлу, чтобы он математические операции с десятичными дробями адекватно выполнял? Или всю математику перемножать в integer?

Оффлайн joymix

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 11
  • +0/-0
  • 0
    • Просмотр профиля
    • http://inform.sir.edu
Почему 1.9-1.89= 0.00999999999930878
« Ответ #5 : 10 Мая 2006, 01:38:24 »
мне вот забавно, а если бы это были деньги? Начинаю верить во всякие сказачные взломы кошельков  :)))))

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Почему 1.9-1.89= 0.00999999999930878
« Ответ #6 : 10 Мая 2006, 04:20:42 »
Что-то я не пойму Вашей проблемы. Вроде Вам уже ответили. Если нужно распечатать используйте printf, если только хранить, то оставьте как есть и не смотрите как оно там лежит, не нравится как есть, перезапишите sprintf\'ом.
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн Kannabismus

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 18
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Почему 1.9-1.89= 0.00999999999930878
« Ответ #7 : 10 Мая 2006, 15:45:02 »
Вопрос из фака.

perldoc -q "Why am I getting long decimals"
perldoc perlnumber

Оффлайн xames

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 62
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Почему 1.9-1.89= 0.00999999999930878
« Ответ #8 : 12 Мая 2006, 20:43:27 »
На тему чисел в перле:

perldoc Math::BigFloat
perldoc Math::BigInt

Может что интересное найдете.

Оффлайн CGVictor

  • теперь местный
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2511
  • +0/-0
  • 2
    • Просмотр профиля
    • http://cg.net.ru
Почему 1.9-1.89= 0.00999999999930878
« Ответ #9 : 13 Мая 2006, 23:38:47 »
All
[moderatorial]
Тема обжевывалась помногу раз. Сравнение float-ов может работать только до известного предела.
Формулу return(abs(a-b)
LJ: Backslashed life (rss)

 

Sitemap 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