быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705

Конструктор объекта Decimal не создаёт числа с нужной точностью (python 3.3.5)

21.04.2017, 19:11. Показов 6717. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Друзья! Сперва работаем со строками:

Python
1
2
3
4
5
6
Python 3.3.5 (v3.3.5:62cf4e77f785, Mar  9 2014, 10:37:12) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import decimal
>>> decimal.Decimal('4') / decimal.Decimal('2.00')
Decimal('2')
>>>
Результат '2' вообще неправильный, должно быть '2.00':

Когда в выражении участвуют числа с различной точностью представ ления, Python автоматически выбирает наибольшую точность для представления результата.
(Лутц, "Изучаем питон", 4-е издание)

++++++++++++++++++++++++++++++++++++++++ ++++++

Теперь работаем с числами:
Python
1
2
3
4
5
>>> decimal.getcontext().prec = 2
>>> decimal.Decimal(4) / decimal.Decimal(2)
Decimal('2')
>>> decimal.Decimal(4) + decimal.Decimal(2)
Decimal('6')
Так, вместо '2' и '6' должно быть '2.00' и '6.00'
В общем, несмешные какие-то шутки у моего интерпретатора. ЧЯДНТ? Спасибо, кто откликнется.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.04.2017, 19:11
Ответы с готовыми решениями:

Autolisp. программа создает сферу не в нужной точке
Доброго времени суток. В этом деле я новичок. Проблема: программа создает сферу не в нужной точке, а на нужной высоте. Не могу...

Как округлить decimal с заданной точностью?
Как округлить положительное decimal с точностью до определенного количества знаков после запятой в сторону возрастания и убывания?...

Что выгодней: (decimal,decimal) или decimal[]
Что выгоднее для памяти и производительности: создание кортежей (decimal,decimal) или массивов decimal? Предполагается большое количество. ...

35
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
22.04.2017, 14:48
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kravam Посмотреть сообщение
да конечно, я сам это придумал.
Ну как бы да. Ты не правильно понял увиденный пример из-за этого делаешь ошибочные утверждения. Вот запусти у себя любой пример из книги (написанный 1 в 1) и получишь такой же вывод как и в книге.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
22.04.2017, 14:53  [ТС]
Цитата Сообщение от alex925 Посмотреть сообщение
Ну как бы да. Ты не правильно понял увиденный пример из-за этого делаешь ошибочные утверждения. Вот запусти у себя любой пример из книги (написанный 1 в 1) и получишь такой же вывод как и в книге.
примеры из книги у меня запускаются, как в книге. Но другие примеры (не книжные) у меня запускаются не так, как пишет Лутц. Понимаешь? Если человек пишет правило, он же распространяет его не только на приведённые примеры, так ведь?
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
22.04.2017, 15:04
Цитата Сообщение от kravam Посмотреть сообщение
Но другие примеры (не книжные) у меня запускаются не так, как пишет Лутц. Понимаешь?
Отлично понимаю, а ты не понимаешь, что не правильно понял книжные примеры.

Ты паникуешь, что вычисления могут пройти не с надлежащей точностью, но в твоем коде этого не происходит, это только твое воображение.

https://docs.python.org/3.6/li... t-tutorial
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
22.04.2017, 15:12  [ТС]
Цитата Сообщение от alex925 Посмотреть сообщение
Ты паникуешь, что вычисления могут пройти не с надлежащей точностью, но в твоем коде этого не происходит, это только твое воображение.
ну как же не происходит, очень даже происходит. Так, в примере из этого сообщения
https://www.cyberforum.ru/pyth... st10356570
согласно Лутцу, должно вывестись 2.00, а выводится 2. Или Лутц не прав, или я что не так понял, хотя что там понимать во фразе "Когда в выражении участвуют числа с различной точностью представления, Python автоматически выбирает наибольшую точность для представления результата: ", кроме как, что в одном из чисел интерпретатор видит два знака после точки (а в другом после точки знаков нет) и и в результате тоже должно быть два знака после запятой, я не представляю.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
22.04.2017, 15:15
Цитата Сообщение от kravam Посмотреть сообщение
согласно Лутцу, должно вывестись 2.00, а выводится 2
Покажи мне цитату где говорится это. Он такого не говорит.

И кстати все таки глянь ссылочку приложенную мной. Ты уже на столько начал сходить с ума, что оф. документации не веришь?
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
22.04.2017, 15:17  [ТС]
Цитата Сообщение от alex925 Посмотреть сообщение
Покажи мне цитату где говорится это. Он такого не говорит.
а, то есть тебе нужна фраза, что "если в одном из выражений будет 2.00, а в другом 2, то в результате тоже будет 2.00", то да, такой фразы нет. Ну на нет и суда нет. Честно, мне тебе и возразить нечего.

Вопрос открыт.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
22.04.2017, 15:18
Цитата Сообщение от kravam Посмотреть сообщение
а, то есть тебе нужна фраза, что "если в одном из выражений будет 2.00, а в другом 2, то в результате тоже будет 2.00",
Нет, мне нужна фраза из которой ты сделал такой вывод.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
22.04.2017, 15:19  [ТС]
Цитата Сообщение от alex925 Посмотреть сообщение
Ты уже на столько начал сходить с ума, что оф. документации не веришь?
я бы всё-таки был последовательным. Это означает, что нужно сперва с одним вопросом разобраться, а потом с другим. В данном случае, это означает, прав ли Лутц или нет. Хотя тут даже и не сам факт правоты или неправ ты важен, а правильно или неправильно я его понял. И от этого вопроса я не могу отмахнуться.

А ссылку я гляну, ты не боись.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
22.04.2017, 15:19
Цитата Сообщение от kravam Посмотреть сообщение
"Когда в выражении участвуют числа с различной точностью представления, Python автоматически выбирает наибольшую точность для представления результата: "
Python
1
2
3
4
5
6
7
from decimal import Decimal
Decimal('4.00') / Decimal('2')
Decimal('2.00')
Decimal('4') / Decimal('2.0000')
Decimal('2')
Decimal('4.0000') / Decimal('2')
Decimal('2.0000')
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
22.04.2017, 18:04  [ТС]
Цитата Сообщение от alex925 Посмотреть сообщение
Нет, мне нужна фраза из которой ты сделал такой вывод.
я не раз уже её приводил, вот она:
Цитата Сообщение от kravam Посмотреть сообщение
Когда в выражении участвуют числа с различной точностью представления, Python автоматически выбирает наибольшую точность для представления результата
Жду возражений в стиле: ты не так понял, а как надо- не скажу. Давно их не было.

Добавлено через 2 часа 43 минуты
Цитата Сообщение от alex925 Посмотреть сообщение
Python
1
2
3
4
5
6
7
from decimal import Decimal 
Decimal('4.00') / Decimal('2') 
Decimal('2.00') 
Decimal('4') / Decimal('2.0000') 
Decimal('2') 
Decimal('4.0000') / Decimal('2') 
Decimal('2.0000')
Ну вот в первом примере интерпретатор смотрит, определяет сколько чисел писать после точки в результате и, коль скоро на входе два числа, '4.00' и '2', видит два ноля и пишет в результате после точки два знака, то есть '2.00'

Так, и в третьем примере видит на входе числа '4.0000' и '2', видит после точки 4 знака и в результате пишет 4 знака: '2.0000'

И это всё согласно Лутцу.

А вот во втором примере интерпретатор поступает НЕ согласно Лутцу. Она на входе видит числа '4' и '2.0000', видит 4 ноля после запятой, но почему-то в результате 4 знака после точки уже не пишет.

Может, я Лутца не так понял? А как его ещё-то понимать? Вот мы в примере наблюдаем, что компилятор игнорирует количество знаков после точки в ЗНАМЕНАТЕЛЕ (в делителе). Но Лутц-то это не оговорил, вот в чём дело. Он же не сказал, что правило, им введённое, при делении чисел верно только в том случае, если количество знаков после точки максимальное У ДЕЛИМОГО. Ничего подобного он не пишет. Нет у него градации на числитель и знаменатель. Числа-операнды и баста.
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
22.04.2017, 18:41
Цитата Сообщение от kravam Посмотреть сообщение
ну как же не происходит, очень даже происходит. Так, в примере из этого сообщения
https://www.cyberforum.ru/pyth... st10356570
согласно Лутцу, должно вывестись 2.00, а выводится 2. Или Лутц не прав, или я что не так понял, хотя что там понимать во фразе "Когда в выражении участвуют числа с различной точностью представления, Python автоматически выбирает наибольшую точность для представления результата: ", кроме как, что в одном из чисел интерпретатор видит два знака после точки (а в другом после точки знаков нет) и и в результате тоже должно быть два знака после запятой, я не представляю.
Лутц не прав. В книге ошибка. Python не выбирает наибольшую точность для представления результата.
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
22.04.2017, 18:45  [ТС]
Цитата Сообщение от oldnewyear Посмотреть сообщение
Лутц не прав.
Смело. Ну как смело- на фоне остальных. И по теме, что радует. Буду рад услышать ещё мнения.
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
22.04.2017, 18:49
Иначе, согласно этой логике Decimal('1.13') * Decimal('1.39') должно быть Decimal('1.57'). Потеряли 2 знака от 1.5707.
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
22.04.2017, 18:58  [ТС]
Цитата Сообщение от oldnewyear Посмотреть сообщение
Иначе, согласно этой логике Decimal('1.13') * Decimal('1.39') должно быть Decimal('1.57'). Потеряли 2 знака от 1.5707.
ну так оно. Ну понятно же всё, да? А чё ты сначала был против меня? https://www.cyberforum.ru/pyth... st10357703
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
22.04.2017, 19:02
Не для быдлокодера (поскольку он меня в личке быссмыссленно послал в перуанский город Nahui) объясняю:

Вот что на самом деле пишет Лутц в оригинале:
When decimals of different precision are mixed in expressions,
Python converts up to the largest number of decimal digits automatically.
Перевод, на мой взгляд, не совсем точен оригиналу, и хотя может быть признан семантически адекватным,
однако в некоторых неокрепших умах может вызывать приступы когнитивно-диссонансных расстройств
и полную утрату ориентиров.
Официальная документация python decimal подтверждает что "converts up to the largest number of decimal digits automaticall" на примере умножения: For multiplication, the “schoolbook” approach uses all the figures in the multiplicands.

После этой фразы Лутц приводит вполне адекватный пример сложения, который подтверждает сказанное.
Если бы он привел пример с делением, вполне можно допустить, что он сформулировал бы свою мысль немного иначе.
В частности, обозначил бы почему при обычном делении int на float int приводится к типу float (смешанная арифметика в действии - "малый" тип приводится к "большему"), а при делении decimal результат выглядит иначе.
А дело все в том, что согласно спецификации decimal деление производится при помощи "длинной" арифметики, и как именно достаточно подробно расписано в той же Decimal Arithmetic Specification в разделе Arithmetic operations параграф divide.
Я не настолько в этом разбираюсь, чтобы разложить все по полочкам, но похоже, что при делении Decimal('2') на Decimal('1.0') (как и при прочих вариантах деления) ноли конечного результата формируются согласно этому правилу:
The exponent of the result is computed by subtracting the sum of the original exponent of the divisor and the value of adjust at the end of the coefficient calculation from the original exponent of the dividend.

И все вышеизложенное подтверждает реализация типа Decimal в том же C#, поскольку результаты идентичны тем, которые производит модуль decimal в python.
2
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
22.04.2017, 19:42  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Перевод, на мой взгляд, не совсем точен оригиналу, и хотя может быть признан семантически адекватным, однако в некоторых неокрепших умах может вызывать приступы когнитивно-диссонансных расстройств и полную утрату ориентиров.
да перевод как перевод, что ты в самом деле. Ну переведи сам. Тут хоть наизнанку вывернись, но смысл будет тем же самым. Или чё, опять, знаю, но не скажу?

А самое-то главное не в этом. Раз уж ты прав, а я невежа, необходимо найти в оригинале, что речь идёт ИСКЛЮЧИТЕЛЬНО о сложении. А оно не идёт исключительно о сложении- (просто пример сложения приведён).

Так что Лутц написал, что написал. И я понял это именно, как он написал. И правильно сделал, поставив его слова под сомнение. А ты... А что ты... Вот, пожалуй и всё.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.04.2017, 19:42
Помогаю со студенческими работами здесь

this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор)
class Test { int i; public: void test(int i) { this -> i = i; } }; Конструктор Test::Test всегда вызывается...

Конструктор класса и конструктор объекта - это одно и тоже?
Скажите, пожалуйста, кто знает, конструктор класса и конструктор объекта - это одно и тоже?

Конструктор, который создаёт массив
Есть класс, название которого Class_Array. В него есть 5 перегруженных конструкторов Class_Array (), Class_Array ( int count ), ...

Python 3.2: как правильно обращаться с типом Decimal
Новичок в питоне. У меня версия 3.2. Не могу разобраться, почему вот так получается: >>> Decimal('0.1') + Decimal('0.1') +...

Конструктор который создает элементы в списке
Есть код, но проблема в том, что на выводе создается только список без элементов #include <iostream> #include <ctime> ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Опции темы

Новые блоги и статьи
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru