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

Ответ Создать новую тему
 
Kifsif
Форумчанин
8 / 8 / 0
Регистрация: 12.06.2011
Сообщений: 358
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
Форумчанин
56 / 53 / 3
Регистрация: 15.06.2012
Сообщений: 143
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
Сообщений: 358
18.09.2012, 13:55  [ТС]
  #3
Я когда брался за Питон, начитался - легко, легко. А тут на ровном месте такая засада. Ведь это не просто сложность. Черт с ней, со сложностью, это именно засада, вам не кажется?
Rikkit
Форумчанин
56 / 53 / 3
Регистрация: 15.06.2012
Сообщений: 143
18.09.2012, 14:05
  #4
Это не засада. Float число приблизительное с определенной точностью.
Проверил в языке ruby - так же. Это не зависит от языка.
Kifsif
Форумчанин
8 / 8 / 0
Регистрация: 12.06.2011
Сообщений: 358
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
Форумчанин
56 / 53 / 3
Регистрация: 15.06.2012
Сообщений: 143
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 landgen 06.11.2013 22:05
Python Как обращаться к переменным внутри класса из его методов?
Только начинаю осваивать ооп и наткнулся на проблему, ответ на которую не смог найти, гугля несколько часов. Есть такой чисто тестовый код, использующий парадигму ооп: #coding:utf-8 import math...
Python Oleg Gorjajnov 29.07.2013 20:21
Python Почему синтаксис Python 2.* и Python 3.* так отличается?
Привет! Решил на досуге заняться изучением Python'a. Читаю книгу по второму питону, а пользуюсь третьим. Некоторые вещи приходится гуглить, потому что примеры синтаксиса из книги не работают....
Python Kastaneda 10.12.2012 05:08
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
Python Как bass.dll подключить к pyqt или как хотябы использовать в python 3.2?
Вопрос по сабжу. Дайте ссылки или укажите направление хотя бы.
Python: Графика ВАСИЛЕВС 26.06.2012 10:20
Python Как из Python скрипта выполнить другой python скрипт?
Как из Python скрипта выполнить другой python скрипт? Если он находится в той же папке но нужно передать еще передать скрипту аргументы.
Python XoFfiCEr 17.06.2012 15:09
C# WPF Как правильно обращаться к контролам других форм?
Как правильно обращаться к контролам других форм, например: Форма Window1 (Не главная) содержит: public void HW() { this.Hide(); } В форме Window2 в событии кнопки написано: Window1 W1...
C#: WPF и Silverlight MaximusSM 11.08.2011 20:17
C++ Как правильно обращаться к функциям
Всем Привет! Решил заняться с++, но попал в ступор. вообще я занимаюсь программированием на AS2(flash), язык по синтаксису схож с с++, но кое что не совпадает. Например: Если в ActionScript2...
С++ для начинающих GRean 07.11.2008 16:04
Опции темы

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

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