Форум программистов, компьютерный форум CyberForum.ru
CyberForum.ru - форум программистов и сисадминов > >
Восстановить пароль Регистрация

Ответ Создать новую тему
 
Kifsif
Форумчанин
8 / 8 / 0
Регистрация: 12.06.2011
Сообщений: 359
18.09.2012, 11:43     Python 3.2: как правильно обращаться с типом Decimal
  #1
Новичок в питоне. У меня версия 3.2.

Не могу разобраться, почему вот так получается:
Код Python
1
2
3
4
>>> Decimal('0.1') + Decimal('0.1') + Decimal('0.1')  - Decimal('0.3')
Decimal('0.0')
>>> Decimal(0.1) + Decimal(0.1) + Decimal(0.1)  - Decimal(0.3)
Decimal('2.775557561565156540423631668E-17')
Читаю мануал:
class decimal.Decimal(value="0", context=None)
Construct a new Decimal object based from value.
value can be an integer, string, tuple, float, or another Decimal object.

Далее говорится, что в 3.2 можно стало в конструктор Decimal подставлять данные типа float.
Но почему-то у меня все это работает не так, как нужно.
AdAgent
Объявления
18.09.2012, 11:43
Rikkit
Форумчанин
57 / 54 / 3
Регистрация: 15.06.2012
Сообщений: 146
18.09.2012, 13:50
  #2
У вас получилось число 0,000000000000000027755575
Приблизительно равно нулю

Я думаю это потому, что вы в Decimal передаете 0.1 вещественное число. Оно вроде не совсем равно 0.1. Собственно из-за этого и получается Decimal('2.775557561565156540423631668E-17').

А вот если преобразовать флоат в стринг, то все получится нормально:
Код Python
1
2
>>> Decimal(str(0.1)) + Decimal(str(0.1)) + Decimal(str(0.1))  - Decimal(str(0.3))
Decimal('0.0')
Kifsif
Форумчанин
8 / 8 / 0
Регистрация: 12.06.2011
Сообщений: 359
18.09.2012, 13:55  [ТС]
  #3
Я когда брался за Питон, начитался - легко, легко. А тут на ровном месте такая засада. Ведь это не просто сложность. Черт с ней, со сложностью, это именно засада, вам не кажется?
Rikkit
Форумчанин
57 / 54 / 3
Регистрация: 15.06.2012
Сообщений: 146
18.09.2012, 14:05
  #4
Это не засада. Float число приблизительное с определенной точностью.
Проверил в языке ruby - так же. Это не зависит от языка.
Kifsif
Форумчанин
8 / 8 / 0
Регистрация: 12.06.2011
Сообщений: 359
18.09.2012, 14:20  [ТС]
  #5
Да, я когда-то тоже экспериментировал с подобными вещами. На Java прогонял цикл с шагом 0.1. Он превращался в бесконечный цикл, если условием выхода было целое число. На Delphy, кстати, все нормально было.

Ну, ладно, бог с ней, с этой особенностью.

А вот тогда другой вопрос - вроде бы, Decimal хороший тип. По крайней мере, тип float нельзя использовать для финансовых расчетов, как мы видели только что.

Но вот я не пойму, зачем так сложно:
Decimal(str(0.1)) + Decimal(str(0.1)) + Decimal(str(0.1)) - Decimal(str(0.3))

Ну, говорить о минималистичном синтаксисе язык не повернется. Это у меня у одного такое ощущение?
accept
Форумчанин
4810 / 3210 / 34
Регистрация: 10.12.2008
Сообщений: 10,680
19.09.2012, 04:40
  #6
Код Python
1
2
3
>>> 0.1 + 0.1 + 0.1
0.30000000000000004
>>>
Добавлено через 27 секунд
Цитата Сообщение от Kifsif Посмотреть сообщение
Ну, говорить о минималистичном синтаксисе язык не повернется.
ты просто не знаешь, как кратко записать

Добавлено через 11 минут
Код Python
1
2
3
4
5
6
7
8
>>> import decimal
>>> def f(d):
...   return decimal.Decimal(str(d))
... 
>>> n = f(0.1) + f(0.1) + f(0.1) - f(0.3)
>>> n
Decimal('0.0')
>>>
Rikkit
Форумчанин
57 / 54 / 3
Регистрация: 15.06.2012
Сообщений: 146
19.09.2012, 08:37     Python 3.2: как правильно обращаться с типом Decimal
  #7
По поводу значения float, в C++ тоже выдает.
Код C++
1
2
3
4
5
6
7
#include <cstdio>
using namespace std;
 
int main()
{
    printf("%.20f\n",0.1); //выводит 0.10000000000000000555
}
Yandex
Объявления
19.09.2012, 08:37
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему

Похожие темы
Тема Раздел Ответов Автор Дата
Python Как установить Python 3.3?
Я новичок в питоне и мне не помогла тема "Если вы новичок в Python, то вам сюда". :D Решил установить Python 3.3.2 на Centos 6.4. Насколько я знаю, в линуксах нельзя делать это простым...
Python 16 landgen 06.11.2013 22:05
Python Как перейти с PHP на Python 2?
Доброго времени суток! Начинаю постигать веб-программирование на питоне (2.7.5). Имею опыт на пхп (из-за чего, к сожалению, тащатся его принципы организации кода). Из прочитанного пока что "Learn...
Python 14 TrogWarZ 30.09.2013 23:33
Python Как запустить pydocgui на Python 3.3.2?
Помогите, пожалуйста, с таким вопросом: На Win 7 питон 3.3.2 не запускается pydocgui, ни через Module Docs в меню пуск, ни через pydocgui.pyw в папке питона. На другом компьютере с Win 7 питон...
Python 15 JohnHomo 28.09.2013 03:13
Python Как обращаться к переменным внутри класса из его методов?
Только начинаю осваивать ооп и наткнулся на проблему, ответ на которую не смог найти, гугля несколько часов. Есть такой чисто тестовый код, использующий парадигму ооп: #coding:utf-8 import math...
Python 3 Oleg Gorjajnov 29.07.2013 20:21
Python Python 3.2: как работать с документацией?
print(, *, sep=' ', end='\n', file=sys.stdout) Вот ссыль на мануал: http://docs.python.org/py3k/library/functions.html?highlight=print#print Не могу понять ничего. Это что - объект не...
Python 19 Kifsif 23.01.2013 14:09
Python Почему синтаксис Python 2.* и Python 3.* так отличается?
Привет! Решил на досуге заняться изучением Python'a. Читаю книгу по второму питону, а пользуюсь третьим. Некоторые вещи приходится гуглить, потому что примеры синтаксиса из книги не работают....
Python 5 Kastaneda 10.12.2012 05:08
Python Как bass.dll подключить к pyqt или как хотябы использовать в python 3.2?
Вопрос по сабжу. Дайте ссылки или укажите направление хотя бы.
Python: Графика 0 ВАСИЛЕВС 26.06.2012 10:20
Python Как из Python скрипта выполнить другой python скрипт?
Как из Python скрипта выполнить другой python скрипт? Если он находится в той же папке но нужно передать еще передать скрипту аргументы.
Python 6 XoFfiCEr 17.06.2012 15:09
Опции темы

Текущее время: 07:37. Часовой пояс GMT +4.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.7 PL3
Copyright ©2000 - 2014, vBulletin Solutions, Inc.