【问题标题】:When and why number evaluates to NaN, after multiplying, in Javascript?在Javascript中,乘法后,数字何时以及为什么计算为NaN?
【发布时间】:2013-07-17 02:30:17
【问题描述】:

根据我的经验,我知道,在进行除法运算或尝试从字符串中生成数字时,当它实际上不包含数字时,我可以获得NaN。还有其他情况,我什么时候可以得到NaN。特别是——是否有可能从乘法中得到它?

这是我在 PhoneGap 应用程序中使用的一段代码:

var g = 9.80665;

acceleration.x = (acceleration.x * g).toFixed(2);
acceleration.y = (acceleration.y * g).toFixed(2);
acceleration.z = ((acceleration.z + 1) * g).toFixed(2);

accelerationbase PhoneGap object,我几乎不敢相信它包含一个字符串或任何其他值,除了浮点数,这可能导致 NaN

但是,在某些特定情况下(在某些特定设备上)我会从上面得到NaN

用这样的代码“保护”上述值对我来说不是问题:

acceleration.x = (parseFloat(acceleration.x) || 0) + ' m/s\u00b2';
acceleration.y = (parseFloat(acceleration.y) || 0) + ' m/s\u00b2';
acceleration.z = (parseFloat(acceleration.z) || 0) + ' m/s\u00b2';

但是,我真的很好奇,我什么时候以及为什么在只乘以一些值之后可以得到NaN

顺便说一句:我在 MDN 上读过 this,在 Stack Overflow 上也读过 many related answers here,但没有给我任何帮助或回答我的问题。

【问题讨论】:

  • 为什么不同时发布加速对象(或至少相关属性)的console.log?现在,我唯一看到的是“其中一个属性未定义”
  • @Stephen:我不能为此发布 console.log,因为(正如我所写的)它只发生在某些情况下(在某些移动设备上)。此外,问题是“什么时候我可以从 Javascript 中的乘法中得到 NaN”,而不是“我的 PhoneGap 代码有什么问题”。也许我应该在“程序员”问这个?

标签: javascript cordova numbers nan


【解决方案1】:

将一个数字与无法转换为数字的事物相乘时,您会得到一个 NaN。

1 * '100'         // 100 because '100' will be converted to 100
1 * ''            // 0 because '' will be converted to 0
1 * 'ten'         // NaN because 'ten' can't be converted to a number
1 * []            // 0 because [] converted to number will be 0
1 * [123]         // 123 because [] will be 123
1 * ['ten']       // NaN
1 * {}            // NaN
1 * true          // 1 because true will be 1
1 * false         // 0
1 * null          // 0
1 * undefined     // NaN, undefined can't be converted to number
1 * function(){}  // NaN

函数'isNaN'检查表达式是否可以转换为数字。您可以检查乘法的两个数字以确认两者都是数字以避免错误。

为了完整起见,要知道变量是否完全是 NaN,您必须将其与自身进行比较:

var a = NaN;
if (a != a) console.log('a is NaN');

这是因为 NaN 被定义为不等于一切,包括它自己。

【讨论】:

  • 您的两个问题都表明,PhoneGap 存在缺陷,并且 acceleration 在某些特定情况下未定义。所以我的假设(它总是被定义)是错误的。谢谢。
【解决方案2】:

您确定这些值永远不会是未定义的吗?文档没有这么说,但我认为这是可能的。

http://docs.phonegap.com/en/1.0.0/phonegap_accelerometer_accelerometer.md.html#Acceleration

【讨论】:

  • 您的两个问题都表明,PhoneGap 存在缺陷,acceleration 在某些特定情况下未定义。所以我的假设(它总是被定义)是错误的。谢谢。我选择了 Kaizo 的答案,因为它更接近于回答问题(这通常与 PhoneGap 无关)。
【解决方案3】:

0 * Infinity ----> NaN 至少在 Chrome 和 Firefox 中。

Infinity * Infinity3.14159 * InfinityInfinity + Infinity 表现良好。他们都是Infinity

Infinity - Infinity 也是NaN

您可能认为您没有Infinitys,但0.000001/0 足以创建一个。

【讨论】:

    猜你喜欢
    • 2013-06-05
    • 2017-06-24
    • 2020-12-29
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    相关资源
    最近更新 更多