Javascript: строковое представление чисел
Как javascript преобразует числа в строки? Я ожидаю, что он округлит число до некоторой точности, но не похоже, что это так. Я сделал следующие тесты:
> 0.1 + 0.2
0.30000000000000004
> (0.1 + 0.2).toFixed(20)
'0.30000000000000004441'
> 0.2
0.2
> (0.2).toFixed(20)
'0.20000000000000001110'
Это поведение в Safari 6.1.1, Firefox 25.0.1 и node.Яш 0.10.21.
Похоже, что javascript отображает 17-ю цифру после десятичной запятой для (0.1 + 0.2), но скрывает ее для 0.2 (и поэтому число округляется до 0.2).
Как именно работает преобразование числа в строку в JavaScript?
2 ответов:
От автора вопроса:
Я нашел ответ в спецификации скрипта ECMA: http://www.ecma-international.org/ecma-262/5.1/#sec-9.8.1
При печати числа javascript вызывает функцию toString (). Спецификация toString () объясняет, как javascript решает, что печатать. Это примечание ниже
The least significant digit of s is not always uniquely determined by the requirements listed in step 5.Так же как и здесь: http://www.ecma-international.org/ecma-262/5.1/#sec-15.7.4.5
The output of toFixed may be more precise than toString for some values because toString only prints enough significant digits to distinguish the number from adjacent number values.Объясните основную идею, лежащую в основе поведение toString ().
Речь идет не о том, как работает javascript, а о том, как работают операции с плавающей запятой в целом. Компьютеры работают в двоичном формате, но люди в основном работают в базе 10. Это вводит некоторую неточность здесь и там; насколько плохая неточность зависит от того, как работает оборудование и (иногда) программное обеспечение, о котором идет речь. Но главное заключается в том, что вы не можете точно предсказать, какие ошибки будут, только то, что ошибки будут.
В Javascript нет такого правила, как "отображать так много чисел после десятичная точка для некоторых чисел, но не для других.- Вместо этого компьютер дает вам наилучшую оценку запрошенного числа.
0.2- это не то, что можно легко представить в двоичном виде, поэтому, если вы попросите компьютер использовать большую точность, чем это было бы в противном случае, вы получите ошибки округления (в этом случае1110в конце).Это фактически тот же самый вопрос, что и Этот старый. Из превосходного сообщества wiki ответ там:
Все плавающие точка математика похожа на это и основана на стандартеIEEE 754 . JavaScript использует 64-битное представление с плавающей запятой, которое совпадает с представлением Java
double.
Comments