3

我在尝试破坏我的代码时发现了这种意外行为......有人可以向我解释为什么会这样以及应该如何确保提供的值是真正的浮点数?

例如:

alert(parseFloat('4.2.2'));

我期待NaN......不是我得到的。

我在这里做了一个非常简单的 jsfiddle 演示。

4

4 回答 4

7

这就是parseFloatandparseInt方法的工作原理。他们解析到输入变得无效的点。它们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);
}
于 2013-02-23T16:32:49.223 回答
2

将浮点数解析回字符串并比较它们是否相等

于 2013-02-23T16:32:10.160 回答
2

parseFloat从左到右解析其字符串参数,直到遇到错误条件,此时它停止解析。

根据Mozilla

parseFloat 解析它的参数,一个字符串,并返回一个浮点数。如果遇到符号(+ 或 -)、数字 (0-9)、小数点或指数以外的字符,则返回该点之前的值并忽略该字符和所有后续字符。如果第一个字符不能转换为数字,则 parseFloat 返回 NaN。

所以它开始从左到右解析一个浮点数,直到它不能再解析它。在您的情况下,一切正常,直到遇到小数点后第二位。此时,它不再是有效的浮点数,因此它停止解析。

在另一个示例中,如果您调用 parseFloat('100ASDF'),它将返回 100,而不是 NaN。

于 2013-02-23T16:32:55.593 回答
2

当您阅读它的文档时,它似乎足够基本:

parseFloat 解析它的参数,一个字符串,并返回一个浮点数。如果遇到符号(+ 或 -)、数字 (0-9)、小数点或指数以外的字符,则返回该点之前的值并忽略该字符和所有后续字符。允许前导和尾随空格。

于 2013-02-23T16:33:40.627 回答