Вопрос по hashtable, python, dictionary – Неожиданные представления с плавающей точкой в Python

3

Здравствуйте, я использую словарь в Python, хранящий некоторые города и их население, как это:

population = { 'Shanghai' : 17.8, 'Istanbul' : 13.3, 'Karachi' : 13.0, 'mumbai' : 12.5 }

Теперь, если я использую командуprint populationЯ получаю результат:

{'Karachi': 13.0, 'Shanghai': 17.800000000000001, 'Istanbul': 13.300000000000001, 'mumbai': 12.5}

тогда как если я использую командуprint population['Shanghai'] Я получаю первоначальный вклад17.8.

Мой вопрос к вам, как17.8 и13.3 превратился в17.800000000000001 а также13.300000000000001 соответственно? Как создавалась вся эта информация? И почему он там хранится, поскольку мой первоначальный ввод означает, что мне не нужна эта дополнительная информация, по крайней мере, насколько я знаю.

Словарь не является тем, что ведет себя неожиданно для вас. Вы просто столкнулись сFloating Point номера. MattH

Ваш Ответ

3   ответа
2

как числа с плавающей точкой работают в компьютерах.

По сути, не все десятичные числа можно хранить точно, и в этих случаях вы получите максимально возможное число. Иногда эта абстракция протекает, и вы видите ошибку.

Вероятно, это связано с различиями в логике печати, используемой для двух описанных вами вариантов использования. Я не смог воспроизвести поведение (используя Python 2.7.2 в Win64).

Если вы используете номер, которыйis точно представимый, такой как1.5Я бы догадался, что эффект исчезнет.

Добавить нечего, раскрутка верна по обоим пунктам. Когда вы "печатаете" дикт, вы получаете внутреннее представление значений с плавающей точкой, в то время как при печати значения с плавающей точкой вы получаете & quot; stringyfied & quot; (округленная) версия. Попробуйте "print repr (население [" Шанхай ")) и & quot; печатать str (население [& quot; Шанхай & quot;]) & quot; ...
Спасибо Вам за информацию. Я предполагаю, что числа с плавающей точкой должны иметь место. Я оставлю этот ответ открытым, чтобы посмотреть, собирается ли кто-нибудь еще что-то добавить, а если нет, то я его закрою. Еще раз спасибо. NlightNFotis
4

что нового страница:

Python now uses David Gay’s algorithm for finding the shortest floating point representation that doesn’t change its value. This should help mitigate some of the confusion surrounding binary floating point numbers.

The significance is easily seen with a number like 1.1 which does not have an exact equivalent in binary floating point. Since there is no exact equivalent, an expression like float('1.1') evaluates to the nearest representable value which is 0x1.199999999999ap+0 in hex or 1.100000000000000088817841970012523233890533447265625 in decimal. That nearest value was and still is used in subsequent floating point calculations.

What is new is how the number gets displayed. Formerly, Python used a simple approach. The value of repr(1.1) was computed as format(1.1, '.17g') which evaluated to '1.1000000000000001'. The advantage of using 17 digits was that it relied on IEEE-754 guarantees to assure that eval(repr(1.1)) would round-trip exactly to its original value. The disadvantage is that many people found the output to be confusing (mistaking intrinsic limitations of binary floating point representation as being a problem with Python itself).

The new algorithm for repr(1.1) is smarter and returns '1.1'. Effectively, it searches all equivalent string representations (ones that get stored with the same underlying float value) and returns the shortest representation.

The new algorithm tends to emit cleaner representations when possible, but it does not change the underlying values. So, it is still the case that 1.1 + 2.2 != 3.3 even though the representations may suggest otherwise.

The new algorithm depends on certain features in the underlying floating point implementation. If the required features are not found, the old algorithm will continue to be used. Also, the text pickle protocols assure cross-platform portability by using the old algorithm.

(Contributed by Eric Smith and Mark Dickinson; issue 1580)

1

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

Смотрите руководство по Python для информации:http://docs.python.org/library/decimal.html

>>> from decimal import Decimal
>>> print Decimal('3.14')
3.14
кроме заботы -Decimals все еще являются числами с плавающей точкой, только с основанием 10 вместо основания 2.

Похожие вопросы