Другой вопрос с плавающей точкой

Я прочитал большинство сообщений на здесь относительно плавающей точки, и я понимаю основную базовую проблему, что использование IEEE 754 (и только по природе хранения чисел в двоичном файле) определенные части не может быть представлено. Я пытаюсь выяснить следующее: Если и Python и JavaScript используют стандарт IEEE 754, почему случается так что выполнение следующего в Python

.1 +.1

Результаты в 0,20000000000000001 (который должен ожидаться),

Где как в JavaScript (по крайней мере, в Chrome и Firefox) ответ.2

Однако выполнение

.1 +.2

На обоих языках приводит к 0,30000000000000004

Кроме того, выполняя var = 0.3; в JavaScript и печати результаты в 0,3

Где, поскольку выполнение = 0.3 в Python приводит к 0,29999999999999999

Я хотел бы понять причину этого различия в поведении.

Кроме того, многие сообщения на ОС связываются с портом JavaScript BigDecimal Java, но ссылка является битой. У кого-либо есть копия?

5
задан SilentGhost 10 November 2010 в 11:06
поделиться

3 ответа

выполнение a = 0.3 в Python приводит к 0,29999999999999999

Не совсем - смотрите:

>>> a = 0.3
>>> print a
0.3
>>> a
0.29999999999999999

Как видите, print ing a действительно показывает 0,3 - потому что по умолчанию print округляет до 6 или 7 десятичных цифр, при вводе выражения (здесь a - это выражение с одной переменной) в подсказке показывает результат с более чем вдвое большим количеством цифр (таким образом, выявляя внутренние ограничения с плавающей запятой. ).

Javascript может иметь несколько иные правила округления при отображении чисел, и точных деталей округления достаточно, чтобы объяснить наблюдаемые вами различия. Обратите внимание, например (на консоли Chrome javascript):

> (1 + .1) * 1000000000
  1100000000
> (1 + .1) * 100000000000000
  110000000000000.02

видите? если вам удастся увидеть больше цифр, аномалии (которые неизбежно будут там) также станут видимыми.

6
ответ дан 14 December 2019 в 01:02
поделиться

и печать.

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

При работе с числами с плавающей запятой важно то, как структурированы двоичные данные, а не то, что они отображаются на экране.

3
ответ дан 14 December 2019 в 01:02
поделиться

Я хотел бы понять причину такого различия в поведении.

  1. Это разные языки.

  2. Они используют разные базовые пакеты.

  3. У них разные реализации.

Когда вы говорите "Python" - о какой реализации вы говорите? C, Jython, IronPython? Сравнивали ли вы каждую из них?

Люди из Javascript, похоже, обрабатывают повторяющиеся двоичные дроби иначе, чем люди из Python.

Иногда Javascript спокойно подавляет биты ошибки в конце. Иногда нет.

Вот в чем причина.

У вас есть исходный код для обоих вариантов. Если вы хотите узнать больше, вы можете это сделать. Однако знание исходного кода мало что меняет.

0
ответ дан 14 December 2019 в 01:02
поделиться
Другие вопросы по тегам:

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