Почему неявно округляется число независимо от того, какой dtype я использую? - PullRequest
4 голосов
/ 16 июня 2020

Я пытался исправить ошибку в моем коде, которая ломалась. Я хочу, чтобы значение было представлено точно так, как я указал, но похоже, что Python округляет число. Ниже приведен пример.

x = 3069682093880544.81
print (x)
3069682093880545.0
x = Decimal(3069682093880544.81)
print (x)
3069682093880545
x = float(3069682093880544.81)
print(x)
3069682093880545.0
x = Decimal(str(3069682093880544.81))
print(x)
3069682093880545.0
3069682093880545.0
x = str(3069682093880544.81)
print(x)
3069682093880545.0

Все, что я хочу, - это иметь возможность назначать точное значение переменной, и она предоставляет мне то же значение при вызове. Что я делаю не так?

Ответы [ 2 ]

6 голосов
/ 16 июня 2020

Число 3069682093880544.81 преобразуется в 64-битное число с плавающей запятой в соответствии с форматом IEEE. Ближайшее число в этом формате - 43910A47D717A69F. Однако обратное преобразование этого числа будет 3069682093880544,64. Как видите, последние 2 цифры после запятой изменились.

Количество значащих цифр в 64-битном с плавающей запятой IEEE составляет 16 цифр. Вероятно, поэтому при выводе на печать после 16 цифр печать прекращается, а это 3069682093880545.

Если вам нужно больше десятичных знаков, вам нужно выбрать метод, который не имеет числа с плавающей запятой IEEE. его обработки. (Обратите внимание, что даже интерпретатор исходного кода уже будет анализировать числа в формате с плавающей запятой.) Как упомянуто @ LeopardShark,

from decimal import *
print(Decimal("3069682093880544.81"))

переходит от String к Decimal без какой-либо обработки как float.

5 голосов
/ 16 июня 2020

Проблема в том, что литерал 3069682093880544.81 разбирается как float. Итак, ваш второй оператор, например, эквивалентен Decimal(float(3069682093880544.81)). Вам нужно Decimal("3069682093880544.81"), который анализирует его как строку, а затем преобразует ее в Decimal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...