Форум программистов, компьютерный форум CyberForum.ru Форум программистов | Компьютерный форум | Форум web-программистов | Форум по электронике и бытовой технике | Форум о софте | Научный форум | Карьера и бизнес
CyberForum.ru - форум программистов и сисадминов > Форум Форум программистов > Форум Python
Восстановить пароль Регистрация

Ответ Создать новую тему
 
18.09.2012, 11:43   #1
Kifsif
Форумчанин
Регистрация: 12.06.2011
Сообщений: 358
Репутация: 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, 11:43
AdAgent
Объявления
18.09.2012, 13:50   #2
Rikkit
Форумчанин
Регистрация: 15.06.2012
Сообщений: 136
Репутация: 52 (49)
Лучшие ответы: 2
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 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
Сообщений: 358
Репутация: 8 (8)
Python 3.2: как правильно обращаться с типом Decimal

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

Это не засада. Float число приблизительное с определенной точностью.
Проверил в языке ruby - так же. Это не зависит от языка.
18.09.2012, 14:05
AdAgent
Объявления
18.09.2012, 14:20  [ТС]   #5
Kifsif
Форумчанин
Регистрация: 12.06.2011
Сообщений: 358
Репутация: 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,680
Репутация: 4809 (3209)
Лучшие ответы: 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
Сообщений: 136
Репутация: 52 (49)
Лучшие ответы: 2
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
Объявления
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему

Похожие темы
Тема Раздел Автор Дата
C#: Как правильно инициализировать переменную типа decimal на примере нахождения массы двух планет
Здравствуйте, друзья. Подскажите, пожалуйста, как правильно инициализировать переменную типа decimal на примере нахождения массы двух планет (Плутон 1,3*10 в 22 степени, и Нептун 1*10 в 26 степени). Понятно, что можно записать: decimal pluto = 130000000000000000000000m; decimal neptune =...
C# для начинающих OdessaNA 27.11.2013 22:10
JavaScript: Как правильно обращаться к свойствам класса из метода
Пишу скролл, суть такова, в обработчике mousedown у объекта свойство slide меняется на true, а при mousemove скролл двигается если slide == true. Но видимо я что-то делаю не так, потому что свойство класса не доступны методам. function Slider(id, inputId) { this.slider = id; ...
JavaScript Leoleshucov008 04.10.2013 16:12
PHP ООП: Как правильно обращаться к статическим элементам
class A { static public $li=9; public $re=800; } class B extends A{ public $foo=100; static public $li='xa'; public function fr(){ return parent::$li;
PHP и ООП koza4ok 15.10.2012 11:37
C# WPF: Как правильно обращаться к контролам других форм?
Как правильно обращаться к контролам других форм, например: Форма Window1 (Не главная) содержит: public void HW() { this.Hide(); } В форме Window2 в событии кнопки написано: Window1 W1 = new Window1(); W1.HW(); Но форма Window1 не скрывается и не закрывается если указать...
C#: WPF и Silverlight MaximusSM 11.08.2011 20:17
C++: Как правильно обращаться к функциям
Всем Привет! Решил заняться с++, но попал в ступор. вообще я занимаюсь программированием на AS2(flash), язык по синтаксису схож с с++, но кое что не совпадает. Например: Если в ActionScript2 создавать и обращаться к функции таким образом: function Myfunct(a,b) //создаём функцию Myfunct с...
С++ для начинающих GRean 07.11.2008 16:04
Опции темы

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

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