LINUX.ORG.RU

Python - арифметика


0

1
Python 2.6.4 (r264:75706, Jun  4 2010, 18:20:16) 
[GCC 4.4.4 20100503 (Red Hat 4.4.4-2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 14.40+12.24
26.640000000000001
>>> 1.8 * 8
14.4
>>> 0.18 * 80
14.399999999999999

Что неужели python не может делать простейшие действия над числами?
Воспроизводится ли баг в Python 2.7?

P.S. В Python 3.1 этого бага уже нет, но на него не могу перейти из-за библиотек.

UPD. проблему решил переходом на Perl. Там всё нормально:

print 80*0.18; # 14.4

>>> 0.18
0.17999999999999999

неужели всё так плохо?

Sosiska ()
Ответ на: комментарий от Sosiska

подозреваю что 0.18 в двоичной float форме никак точно ненаписать
все дело в округлении далее

такчто это не баг а фича

ae1234 ★★ ()

Даже интересно, как такого эффекта добиться при написании программы.

damnemall ()
Ответ на: комментарий от ae1234

простите, что за чушь? мне нужны точные финансовые расчеты - python этого не позволяет?

Sosiska ()

в python3 тоже всё плохо

Python 3.1.2 (r312:79147, Aug 23 2010, 05:17:13) 
[GCC 4.4.4 20100630 (Red Hat 4.4.4-10)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 80*0.18
14.399999999999999
Sosiska ()
Ответ на: комментарий от Sosiska

Если вам нужны точные финансовые расчеты забудьте про float.

buddhist ★★★★★ ()
This is SBCL 1.0.38-2.fc13
* (* 80 0.18)
14.400001
GHCi, version 6.12.1
Prelude> 80 * 0.18
14.399999999999999
Sosiska ()
Ответ на: комментарий от Sosiska

> мне нужны точные финансовые расчеты

python

Хоть не бейсик.

damnemall ()
Ответ на: комментарий от Sosiska

для точности используй integer. :-) А так, эти округления даже описаны в стандартах IEEE всяких(а значит питон тут не причем).

Bad_ptr ★★★★ ()
Ответ на: комментарий от Sosiska

> простите, что за чушь? мне нужны точные финансовые расчеты - python этого не позволяет?

Вот откуда кризис - все финансисты перешли на питон, а он деньги тырит!!! Небось в польщу Гвидо, ах он коварный...

http://yandex.ru/yandsearch?text=%D0%BF%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D...

AIv ★★★★★ ()
Ответ на: комментарий от Sosiska

в IEEE 754 оговорен decimal64, коим и подразумеваются, что будут пользоваться для финансовых расчетов.

Arkarar ()

Это не баг, это толсто.

GotF ★★★★★ ()
Ответ на: комментарий от Sosiska

в байтах это выглядит так

0.18;
0a d7 a3 70 3d 0a c7 3f

0.17999999999999999;
0a d7 a3 70 3d 0a c7 3f

просто напросто - мантиса там в двоичном виде
и в нем - 0.18 точно ненаписать некак - ну покрайней мере в 64 битах

ae1234 ★★ ()
Ответ на: комментарий от GotF

Не так толсто, как хотелось бы. Я давно хотел посмотреть на тех, кто делает финансовые расчеты во флоатах, после чего приходят счета типа «145.666666667»

buddhist ★★★★★ ()

проблему решил переходом на Perl. Там всё нормально

Что, неужели результат этого не true?

print 80*0.18 == 14.399999999999999;

metar ★★★ ()

Считать деньги числами с плавающей точкой? Вон из профессии!

И да, набери в питоне print 80*0.18 и удивись. А потом убейся.

PolarFox ★★★★★ ()
Ответ на: комментарий от Sosiska

в python3 тоже всё плохо

Python 3.1.3 (r313:86834, Feb 22 2011, 22:50:28) 
[GCC 4.5.1 20101208 [gcc-4_5-branch revision 167585]] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 80*0.18
14.399999999999999
>>> print(80*0.18)
14.4
>>> print(80*0.18 == 14.399999999999999)
True
metar ★★★ ()
Ответ на: комментарий от Sosiska

хабр:

Самое главное не сказано в статье — нельзя использовать float/double для рассчетов с деньгами. Только числа с фиксированой запятой. Иначе на огруглениях можно много потерять и потом баланс не сойдется.

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

на этом в Англии один подросток банк на несколько тысяч фунтов обставил

Читни хабретца

mmarkk ()

Сколько еще человек зададут этот всем надоевший вопрос? Даже документации этот момент описан, не то что в остальном интернете.

pevzi ★★★★★ ()

>Python - арифметика

= Python без арифметики

Led ★★★☆☆ ()

Мерзкий провокатор. А если не мерзкий, то просто сделай принт, как в перле.

baverman ★★★ ()
Ответ на: комментарий от buddhist

> Я давно хотел посмотреть на тех, кто делает финансовые расчеты во флоатах, после чего приходят счета типа «145.666666667»

Убивать. Убивать, убивать, убивать.

geekless ★★ ()

Когда вы уже все передохните?

anonymous ()

Хороший, годный вброс. Особенно с пунктом про переход на перл.

А вообще есть decimal (это для тех, кто сюда случайно зашел не потроллить).

anonymous ()

Плохо, когда в языке нет встроенных рациональных дробей. Опять Common Lisp оказался лучше питона :)

anonymous ()

А что, double или даже long double не вариант использовать?

Eddy_Em ☆☆☆☆☆ ()

Дак использовать float в финансах или нет с учетом

>>> print(80*0.18)
14.4
>>> print(80*0.18 == 14.399999999999999)
True

?

xio ()
Ответ на: комментарий от xio

(даже не зная питона) так как «проблема» во многих интепретаторах - уменьшите точность округления. Когда precision выставлен до минимального значащего бита - будут наблюдаться хвосты из 9.

Если питон не позволяет настраивать точность, то в нём наверняка есть библиотека gmp - включите её, благо что bc выдаёт правильные результаты.

bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
14.40+12.24
26.64
1.8*8
14.4
0.18*80
14.40

по поводу

print(80*0.18)

14.4

print(80*0.18 == 14.399999999999999)

True

правильно всё - double отличающиеся менее чем на эпсилон считаются равными

MKuznetsov ★★★★★ ()
Ответ на: комментарий от MKuznetsov

Да есть в педоне рациональные дроби - fractions. Вообще не ясны проблемы.

aedeph ()
Ответ на: комментарий от anonymous

в языке нет встроенных рациональных дробей

В модулях подойдёт? Если да, welcome to Python.

Xenesz ★★★★ ()
Ответ на: комментарий от xio

Дак использовать float в финансах или нет с учетом

С каким нах учётом? Любой формат с плавающей точкой в любой реализации противопоказан финансовым задачам.

Xenesz ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.