我在尝试破坏我的代码时发现了这种意外行为......有人可以向我解释为什么会这样以及应该如何确保提供的值是真正的浮点数?
例如:
alert(parseFloat('4.2.2'));
我期待NaN
......不是我得到的。
我在这里做了一个非常简单的 jsfiddle 演示。
我在尝试破坏我的代码时发现了这种意外行为......有人可以向我解释为什么会这样以及应该如何确保提供的值是真正的浮点数?
例如:
alert(parseFloat('4.2.2'));
我期待NaN
......不是我得到的。
我在这里做了一个非常简单的 jsfiddle 演示。
这就是parseFloat
andparseInt
方法的工作原理。他们解析到输入变得无效的点。它们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);
}
将浮点数解析回字符串并比较它们是否相等
parseFloat从左到右解析其字符串参数,直到遇到错误条件,此时它停止解析。
根据Mozilla
parseFloat 解析它的参数,一个字符串,并返回一个浮点数。如果遇到符号(+ 或 -)、数字 (0-9)、小数点或指数以外的字符,则返回该点之前的值并忽略该字符和所有后续字符。如果第一个字符不能转换为数字,则 parseFloat 返回 NaN。
所以它开始从左到右解析一个浮点数,直到它不能再解析它。在您的情况下,一切正常,直到遇到小数点后第二位。此时,它不再是有效的浮点数,因此它停止解析。
在另一个示例中,如果您调用 parseFloat('100ASDF'),它将返回 100,而不是 NaN。
当您阅读它的文档时,它似乎足够基本:
parseFloat 解析它的参数,一个字符串,并返回一个浮点数。如果遇到符号(+ 或 -)、数字 (0-9)、小数点或指数以外的字符,则返回该点之前的值并忽略该字符和所有后续字符。允许前导和尾随空格。