Если x - это целое число из 15 десятичных цифр, то преобразование x в JavaScript Number
, деление на 100 и преобразование результата в число с 15 значащимидесятичные цифры дают ровно x / 100.Далее следует доказательство.
Примечания:
- Преобразование результата деления в число с 15 значащими десятичными цифрами дает в точности x / 100.Фактический результат деления, хотя и в формате
Number
, обычно не будет точно x / 100.Например, 73/100 дает 0,729999999999999982236431605997495353221893310546875. - Преобразование результата деления в больше , чем 15 значащих десятичных цифр, также обычно не даст x / 100, так какдополнительные цифры могут показать разницу, как показано для .73 выше.(И, конечно же, использование меньшего числа цифр может оказаться недостаточным для представления x / 100.) Таким образом, если требуется передать точно x / 100 другому процессу, это должно бытьсделано ровно с 15 значащими десятичными цифрами (или с некоторыми другими мерами по исправлению ошибки).
- Приведенное ниже доказательство относится к 15-значным целым числам x , а не к другим 15-значным десятичным знакам(например, цифры с 15 десятичными цифрами, за которыми следуют один или несколько нулей или цифры, начинающиеся с десятичной точки, за которой следуют несколько нулей и 15 значащих цифр).
Предварительные сведения
JavaScript - этореализация ECMAScript, указанная в Ecma-262 и ISO / IEC 16262. В пункте 6.1.6 Ecma-262 указывает, что базовый 64-битный двоичный формат IEEE-754 используется для ECMAScriptNumber
, за исключением того, что используется только один NaN.Раздел 6.1.6 далее описывает используемую арифметику, которая по существу является арифметикой IEEE-754 с округлением до ближайшего, с привязкой к четности.
Базовый 64-разрядный двоичный формат IEEE-754 использует формат с плавающей запятой53-битное значение.
Единица наименьшей точности (ULP) двоичного числа с плавающей запятой - это значение, приписываемое позиции младшего разряда в его значении.(Таким образом, ULP масштабируется с показателем степени.) Измеряется в ULP, все нормальные 53-битные значения находятся в [2 52 ULP, 2 53 ULP).
Для десятичного числа из 15 значащих цифр его ULP в данном документе будет значением, относящимся к положению позиции 15 th , начиная с первой значащей цифры.
Лемма
Сначала мы установим общеизвестный факт, что преобразование числа из 15 значащих десятичных цифр в Number
и обратно в 15 значащих десятичных цифр дает исходное число, при условии, что число находится в пределах нормального диапазонаформат Number
.
Если x - это число из 15 значащих десятичных цифр (необязательно целое число) в пределах нормального диапазона формата с плавающей запятой (2 -1022 ≤ | x | <2 <sup>1024 ), затем преобразование x в ближайшее значение, представляемое в формате с плавающей запятой, и затем преобразование результатадо 15 значащих десятичных цифриспользует ровно x , когда оба преобразования выполняются с округлением до ближайшего, с привязкой к четному.Чтобы увидеть это, пусть y будет результатом первого преобразования.Если y отличается от x менее чем на ½ ULP, равного x , то x - это 15-значное число, ближайшее к y и, следовательно, должно быть результатом второго преобразования.
IВ первом преобразовании результат y составляет не более ½ ULP от x из-за правила округления.Это относительная точность не более ½ / 2 52 (то есть потенциальная ошибка ½ ULP, деленная на наименьшее значимое значение, которое может быть измерено в ULP).Таким образом, y отличается от x не более чем на одну часть в 2 53 .В худшем случае цифры x могут быть 9999999999999 = 10 15 -1, поэтому ошибка относительно ULP x будет равна (10 15 -1) / 2 53 , что примерно в 0,11 раза превышает ULP x .Таким образом, y всегда отличается от x менее чем на 1/2 от его ULP, поэтому преобразование y обратно в 15 значащих десятичных цифр дает x .
Proof
Если x представляет собой целое число из 15 десятичных цифр, оно точно представляется в формате Number
, поскольку формат Number
имеет 53биты в его значении и, следовательно, способны точно представлять все целые числа до 2 53 , что составляет около 9,007e15, что более 10 15 .
Таким образомпреобразование x в Number
дает в точности x без ошибок.
Затем, по правилам округления арифметических результатов, делим x на 100 дает представимое число, ближайшее к x / 100.Назовите это y .Теперь обратите внимание, что x / 100 - это число, представляемое с 15 значащими десятичными цифрами.(Он может быть записан в научной нотации как x • 10 -2 или в исходном коде как цифры x с суффиксом e-2
.) Обратите внимание, чтопреобразование x / 100 в Number
также дает y , поскольку преобразование дает, как и деление, число, точно представимое в формате Number
, ближайшем к х * * тысяча сто шестьдесят один / 100.По лемме результат преобразования x / 100 в Number
и обратно в число, состоящее из 15 значащих десятичных цифр, дает x / 100, и, следовательно, результат преобразования x до Number
, затем деление на 100, затем преобразование в 15 значащих десятичных цифр также дает x / 100.