Форум программистов, компьютерный форум 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    Python 3.2: как правильно обращаться с типом Decimal
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2012, 11:43    Python 3.2: как правильно обращаться с типом Decimal

Посмотрите здесь:

Python Как изменить скрипт на python

Python как запустить проэкт в Python

Python Как из Python скрипта выполнить другой python скрипт?

Python Python 3.2: как работать с документацией?

Python Почему синтаксис Python 2.* и Python 3.* так отличается?

Python как в Python сделать следующие?

Python Как обращаться к переменным внутри класса из его методов?

Python Как запустить pydocgui на Python 3.3.2?

Python Как использовать urllib2 в Python 3?

Python Как установить Python 3.3?

Rikkit
Форумчанин
60 / 57 / 4
Регистрация: 15.06.2012
Сообщений: 149
18.09.2012, 13:50     Python 3.2: как правильно обращаться с типом Decimal   #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  [ТС]     Python 3.2: как правильно обращаться с типом Decimal   #3
Я когда брался за Питон, начитался - легко, легко. А тут на ровном месте такая засада. Ведь это не просто сложность. Черт с ней, со сложностью, это именно засада, вам не кажется?
Rikkit
Форумчанин
60 / 57 / 4
Регистрация: 15.06.2012
Сообщений: 149
18.09.2012, 14:05     Python 3.2: как правильно обращаться с типом Decimal   #4
Это не засада. Float число приблизительное с определенной точностью.
Проверил в языке ruby - так же. Это не зависит от языка.
Kifsif
Форумчанин
8 / 8 / 0
Регистрация: 12.06.2011
Сообщений: 359
18.09.2012, 14:20  [ТС]     Python 3.2: как правильно обращаться с типом Decimal   #5
Да, я когда-то тоже экспериментировал с подобными вещами. На Java прогонял цикл с шагом 0.1. Он превращался в бесконечный цикл, если условием выхода было целое число. На Delphy, кстати, все нормально было.

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

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

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

Ну, говорить о минималистичном синтаксисе язык не повернется. Это у меня у одного такое ощущение?
accept
Форумчанин
4812 / 3212 / 34
Регистрация: 10.12.2008
Сообщений: 10,680
19.09.2012, 04:40     Python 3.2: как правильно обращаться с типом Decimal   #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
Форумчанин
60 / 57 / 4
Регистрация: 15.06.2012
Сообщений: 149
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 3.2: как правильно обращаться с типом Decimal
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему
Опции темы

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