Десятичная точность работает по-разному в одном наборе данных - PullRequest
3 голосов
/ 15 октября 2019

В настоящее время я пытаюсь округлить стандартные отклонения до шестого знака после запятой из массива данных.

Python round () не сработал так, как я хотел, учитывая, что некоторые числа отображались странно,Например, то, что я имел в виду, было 0,013931, и оказалось 0,013931099999999998. Я исправил суть проблемы, используя десятичную дробь и установив точность контекста до 5, но теперь некоторые стандартные отклонения отображаются округленными до 6-й десятичной, а другие округлены до 7-й!

from decimal import *

getcontext().prec = 4
getcontext().rounding = ROUND_HALF_UP

print(Decimal(0.005855795678472189)/10)
print(Decimal(0.013931099999999998)/10)

Я ожидаювыходное значение равно 0,00058558 и 0,0013931, но фактическое значение равно 0,0005856 и 0,001393, которые имеют разную длину!

1 Ответ

1 голос
/ 15 ноября 2019

Точность в пакете decimal применяется к дробной части числа с плавающей запятой. То есть в научной нотации вы всегда увидите 4 цифры, если вы установите getcontext().prec = 4, например,

>>> print(Decimal(0.005855795678472189)/10)
0.0005856
>>> print(Decimal(0.0005855795678472189)/10)
0.00005856
>>> print(Decimal(0.00005855795678472189)/10)
0.000005856
>>> print(Decimal(0.000005855795678472189)/10)
5.856E-7
>>> print(Decimal(0.0000005855795678472189)/10)
5.856E-8
>>> print(Decimal(0.00000005855795678472189)/10)
5.856E-9
>>> print(Decimal(0.000000005855795678472189)/10)
5.856E-10

Обратите внимание, что числа с плавающей запятой хранятся в трех частях

  • первый бит - это знак (плюс / минус),
  • , следующие несколько бит - это экспонента. (Это 11 бит в числах с плавающей запятой, которые соответствуют стандарту IEEE 754 для 64-битных систем. Это включает C ++ double и python float. Экспонентная часть является тогда двоичным показателем научной нотации -1023, поэтому мы можем иметь числа между e-1024часть экспоненты равна 0 (все нули) и e + 1023, если часть экспоненты равна 2 ** 11-1 = 2047 (все единицы).)
  • остальные биты являются дробной частью.

В статье в Википедии есть подробности.

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