Книга: JavaScript. Подробное руководство, 6-е издание
3.1.4. Двоичное представление вещественных чисел и ошибки округления
3.1.4. Двоичное представление вещественных чисел и ошибки округления
Вещественных чисел существует бесконечно много, но формат представления вещественных чисел в JavaScript позволяет точно выразить лишь ограниченное их количество (точнее, 18437736874454810627). Это значит, что при работе с вещественными числами в JavaScript представление числа часто будет являться округлением фактического числа.
Стандарт представления вещественных чисел IEEE-754, используемый в JavaScript (и практически во всех других современных языках программирования), определяет двоичный формат их представления, который может обеспечить точное представление таких дробных значений, как 1/2, 1/8 и 1/1024. К сожалению, чаще всего мы пользуемся десятичными дробями (особенно при выполнении финансовых расчетов), такими как 1/10,1/100 и т. д. Двоичное представление вещественных чисел неспособно обеспечить точное представление таких простых чисел, как 0.1.
Точность представления вещественных чисел в JavaScript достаточно высока и позволяет обеспечить очень близкое представление числа 0.1. Но тот факт, что это число не может быть представлено точно, может приводить к проблемам. Взгляните на следующий фрагмент:
var х = .3 - .2; // тридцать копеек минус двадцать копеек
var у = .2 - .1; // двадцать копеек минус 10 копеек
x == y; // => false: получились два разных значения
X == .1 // => false: .3-.2 не равно .1
У == .1 // => true: .2-.1 равно .1
Из-за ошибок округления разность между аппроксимациями чисел .3 и .2 оказалась не равной разности между аппроксимациями чисел .2 и .1. Важно понимать, что эта проблема не является чем-то характерным для JavaScript: она проявляется во всех языках программирования, где используется двоичное представление вещественных чисел. Кроме того, обратите внимание, что значения х и у в примере выше очень близки друг к другу и к истинному значению. Точность округления вполне приемлема для большинства применений: проблема возникает лишь при попытках проверить значения на равенство.
В будущих версиях JavaScript может появиться поддержка десятичных чисел' лишенная описанных недостатков, связанных с округлением. Но до тех пор для важных финансовых расчетов предпочтительнее будет использовать масштабируемые целые числа. Например, финансовые расчеты можно производить в копейках, а не в долях рублей.
- 3.1.2. Литералы вещественных чисел
- 3.2.4. Ошибки при задавании вопросов
- Ошибки проектирования базы данных
- 6.2. Типичные ошибки при проведении программ продвижения и варианты их устранения
- 4.2. Формализованное представление угроз ИБ от персонала
- Часть четвертая Стратегии защиты от Главной Ошибки
- 5 Текстовое представление данных: ясные протоколы лежат в основе хорошей практики
- 4.4. Типичные ошибки распределения прав
- Представление дискуссионной группы по управлению проектами
- ГЛАВА 4. ВНУТРЕННЕЕ ПРЕДСТАВЛЕНИЕ ФАЙЛОВ
- Ошибки при подсчете СТП
- 5.3. Округление чисел с плавающей точкой