2013-02-23 4 views
3

Я обнаружил это неожиданное поведение при попытке разбить мой код ... может кто-нибудь объяснить мне, почему это так, и каким должен быть способ убедиться, что поставляемое значение является подлинным поплавком?parseFloat ('4.2.2') дает 4.2 вместо NaN?

, например:

alert(parseFloat('4.2.2')); 

Я ожидал NaN ... не то, что я получил.

Я сделал очень простой демонстрационный пример jsfiddle here.

ответ

7

То есть, как работают parseFloat и parseInt методы. Они анализируются до того момента, когда вход становится недействительным. Они возвращаются NaN только если первый символ является недействительным ..


Цитируя https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/parseFloat

parseFloat разбирает свой аргумент, строку и возвращает число с плавающей точкой. Если он встречает символ, отличный от знака (+ или -), цифры (0-9), десятичной точки или экспоненты, он возвращает значение до этой точки и игнорирует этот символ и все последующие символы. Допускаются ведущие и конечные пробелы.

Если первый символ не может быть преобразован в номер, parseFloat возвращает NaN.


Чтобы проверить, является ли строка число, которое вы можете использовать (из Validate decimal numbers in JavaScript - IsNumeric())

function isNumber(n) { 
    return !isNaN(parseFloat(n)) && isFinite(n); 
} 
+0

Thanks; это имеет смысл, и ваше решение работает как чемпион. –

2

Разбираем назад поплавок в строку и сравнить, если они равны

2

parseFloat анализирует его строковый аргумент, слева направо, пока он не встречает условие ошибки, после чего прекращается разбор.

Согласно mozilla

parseFloat разбирает свой аргумент, строку и возвращает число с плавающей точкой. Если он встречает символ, отличный от знака (+ или -), цифры (0-9), десятичной точки или экспоненты, он возвращает значение до этой точки и игнорирует этот символ и все последующие символы. Если первый символ не может быть преобразован в число, parseFloat возвращает NaN.

Итак, он начинает анализировать поплавок слева направо, пока он не сможет его разобрать. В вашем случае все работает нормально, пока не встретит второе десятичное место. В этот момент он больше не является допустимым поплавком, поэтому он перестает разбираться.

В другом примере, если вы вызываете parseFloat ('100ASDF'), он вернет 100, а не NaN.

2

Кажется достаточно основным, когда вы читаете docs для него:

parseFloat разбирает свой аргумент, строку, и возвращает с плавающей запятой номер. Если встречается символ, отличный от знака (+ или -), номер (0-9), десятичная точка или показатель степени, он возвращает значение до этой точки и игнорирует этот символ и все последующие символы . Допускаются ведущие и конечные пробелы.

Смежные вопросы