Форум программистов и сисадминов CyberForum.ru
Вернуться   Форум программистов и сисадминов CyberForum.ru > Форум Форум программистов > Форум Python
Восстановить пароль Регистрация

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

Новичок в питоне. У меня версия 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.
Но почему-то у меня все это работает не так, как нужно.
Старый 18.09.2012, 13:50   #2
Rikkit
Форумчанин
 
Регистрация: 15.06.2012
Сообщений: 119
Репутация: 47 (44)
Лучшие ответы: 1
Python 3.2: как правильно обращаться с типом Decimal

У вас получилось число 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')
Другие темы раздела Форум программистов Python. Программирование с использованием Python. Помощь в решении задач на Python.
Python 3.2: как работать с документацией? Python
print(, *, sep=' ', end='\n', file=sys.stdout) Вот ссыль на мануал: http://docs.python.org/py3k/library/functions.html?highlight=print#print Не могу понять ничего. Это что - объект не обязателен? Как расшифровывается *? Я вижу в учебнике, как она работает - ставишь после нее цифру,...
Меняем элементы списка местами Python
Привет всем, до этого писал на Basic, где есть оператор SWAP меняющий два элемента местами. Тут по незнанию приходится прописывать небольшую функцию, не уверен, что тем самым я выигрываю во времени. Не подскажите 'заклинание'?
Старый 18.09.2012, 13:55  [ТС]   #3
Kifsif
Форумчанин
 
Регистрация: 12.06.2011
Сообщений: 355
Репутация: 8 (8)
Python 3.2: как правильно обращаться с типом Decimal

Я когда брался за Питон, начитался - легко, легко. А тут на ровном месте такая засада. Ведь это не просто сложность. Черт с ней, со сложностью, это именно засада, вам не кажется?
Старый 18.09.2012, 14:05   #4
Rikkit
Форумчанин
 
Регистрация: 15.06.2012
Сообщений: 119
Репутация: 47 (44)
Лучшие ответы: 1
Python 3.2: как правильно обращаться с типом Decimal

Это не засада. Float число приблизительное с определенной точностью.
Проверил в языке ruby - так же. Это не зависит от языка.
Старый 18.09.2012, 14:05
Google
Объявления
Старый 18.09.2012, 14:20  [ТС]   #5
Kifsif
Форумчанин
 
Регистрация: 12.06.2011
Сообщений: 355
Репутация: 8 (8)
Python 3.2: как правильно обращаться с типом Decimal

Да, я когда-то тоже экспериментировал с подобными вещами. На Java прогонял цикл с шагом 0.1. Он превращался в бесконечный цикл, если условием выхода было целое число. На Delphy, кстати, все нормально было.

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

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

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

Ну, говорить о минималистичном синтаксисе язык не повернется. Это у меня у одного такое ощущение?
Старый 19.09.2012, 04:40   #6
accept
Форумчанин
 
Регистрация: 10.12.2008
Сообщений: 10,678
Репутация: 4800 (3200)
Лучшие ответы: 34
Python 3.2: как правильно обращаться с типом Decimal

Код 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')
>>>
Старый 19.09.2012, 08:37   #7
Rikkit
Форумчанин
 
Регистрация: 15.06.2012
Сообщений: 119
Репутация: 47 (44)
Лучшие ответы: 1
Python 3.2: как правильно обращаться с типом Decimal / Python

По поводу значения float, в C++ тоже выдает.
Код C++
1
2
3
4
5
6
7
#include <cstdio>
using namespace std;
 
int main()
{
    printf("%.20f\n",0.1); //выводит 0.10000000000000000555
}
Старый 19.09.2012, 08:37
Yandex
Объявления
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему

Похожие темы
Тема Автор
Python Как из Python скрипта выполнить другой python скрипт?
Как из Python скрипта выполнить другой python скрипт? Если он находится в той же папке но нужно передать еще передать скрипту аргументы.
XoFfiCEr
C#: WPF и Silverlight Как правильно обращаться к контролам других форм?
Как правильно обращаться к контролам других форм, например: Форма Window1 (Не главная) содержит: public void HW() { this.Hide(); } В форме Window2 в событии кнопки написано: Window1 W1 = new Window1(); W1.HW(); Но форма Window1 не скрывается и не закрывается если указать...
MaximusSM
C# и базы данных, ADO.NET Ошибка Cannot convert from 'ref decimal' to 'ref decimal?
Здравствуйте подскажите пожалуйста почему в строке this.allTuriPoCeneTableAdapter.FillBy(this.turfirmaDataSet.AllTuriPoCene, ref Cena); при компиляции приложения появляется ошибка Cannot convert from 'ref decimal' to 'ref decimal?'. Ошибка возникает в приложении. Не пойму в чем проблема....
Demonicq2010
С++ для начинающих Как правильно обращаться к функциям
Всем Привет! Решил заняться с++, но попал в ступор. вообще я занимаюсь программированием на AS2(flash), язык по синтаксису схож с с++, но кое что не совпадает. Например: Если в ActionScript2 создавать и обращаться к функции таким образом: function Myfunct(a,b) //создаём функцию Myfunct с...
GRean
С++ для начинающих Подскажите как правильно обращаться к фунциям-членам другого класса.
Подскажите как правильно обращаться к фунциям-членам другого класса. 1-й класс (m_list - член класса, которую необходимо вызвать с другого): class CTab_controlDlg : public CDialog { ... public: CListBox m_list; ...
LAPD
Опции темы

Текущее время: 00:00. Часовой пояс GMT +4.

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.7 PL3
Copyright ©2000 - 2014, vBulletin Solutions, Inc.