2010-05-20 2 views
4

В javascript я заметил, что toString и valueOf обрезает конечные 0s после десятичного числа. Например:toString и valueOf усекает конечные 0s после десятичного числа

var num = 0.00 
var num2 = 0.0100 

num.valueOf() or num.toString() // outputs 0 
num2.valueOf() or num2.toString() // outputs 0.01 

Это нормальное поведение и есть ли способ сохранить конечные 0s?

EDIT: Я изменил свой первоначальный вопрос, потому что после некоторого тестирования я понял, что выше это корень проблемы. Благодарю.

+0

Когда вы говорите, что он «не работает должным образом», что идет не так? Вы пробовали отлаживать его каким-то образом? – Pointy

+0

функция формата должна использовать переменную «стиль», чтобы определить, сколько десятичных знаков должно выводиться. Когда я использую первый метод, он отсекает десятичные знаки, но выводит правильно, используя второй метод. Сама функция формата работает очень хорошо, только когда я передаю стиль указанным выше образом, поэтому мне просто интересно, есть ли разница между наличием .toString внутри части format() (метод 1) или снаружи (метод 2). – Choy

+0

Ну, вы вставили какие-то «console.log» вызовы (для Firebug) или какие-то предупреждения или что-то еще, чтобы увидеть, что возвращается эта вещь «typeof», и каков результат этого «toString» при вызове в инструкции if? – Pointy

ответ

4

Это не toString, а valueOf, который усекает конечные 0 с после десятичной!
Когда вы пишете десятичную таким образом:

var num2 = 0.0100 

вы рассказываете интерпретатор, что переменная num2 должно содержать десятичное число 0,0100, т.е. 0,01, так как от последних двух нулей не является существенным.
десятичного числа память представляется в виде десятичного числа:

0.0100 
0.010 
0.01 
0.01000 

все тот же самый номер, и поэтому они все представлены так же, как в памяти. Их невозможно отличить.
Таким образом, невозможно узнать, было ли присвоено num2 значение 0.01, которому присвоено число с нулевым, одним, двумя или более конечными нулями.

Если вы хотите сохранить десятичное число так, как оно написано, вы должны сохранить его как строку.

+0

спасибо за объяснение. – Choy

+0

приветствуется :-) –

2

A номер в javascript не имеет завершающих нулей если бы он мог, где бы вы остановились? Это нормальное поведение. Вы можете заставить их появиться, если вы возвращаете string-

var n= '0.0' 
alert(n)>> 0 
alert(n.toFixed(5))>> '0.00000' 
alert(n.toPrecision(5))>>'0.0000' 
+1

Что делать, если вы пытаетесь преобразовать число точно так же, как написано в строку, и число может иметь 1 ноль, 2 нуля, 5 нулей и т. Д. После этого? Использование toFixed или toPrecision требует знания заранее о том, сколько конечных нулей есть. – Choy