为什么我在这个javaScript代码中得到NaN?

为什么我在这个javaScript代码中得到NaN?,javascript,nan,Javascript,Nan,首先,我测试每个变量都有一个数值: 09-11 18:15:00.420: d_drop: -1.178791867393647 drop_at_zero: 0.0731037475605623 sightHeight: 4.5 d_distance: 40 zeroRange: 10 09-11 18:15:00.420: d_drop: true drop_at_zero: true sightHeight: true

首先,我测试每个变量都有一个数值:

09-11 18:15:00.420:
       d_drop: -1.178791867393647
  drop_at_zero: 0.0731037475605623
   sightHeight: 4.5
    d_distance: 40
     zeroRange: 10

09-11 18:15:00.420:
       d_drop: true
  drop_at_zero: true
   sightHeight: true
    d_distance: true
     zeroRange: true

function isNumber (o) {
  return ! isNaN (o-0) && o != null;
}

 var d_drop; // in calculation this gets value 1.1789

 var d_path = -d_drop - sightHeight + (drop_at_zero + sightHeight) * d_distance / zeroRange;

console.log("Path: " + d_path + " cm");
在日志中:

09-11 18:15:00.430: D/CordovaLog(1533): Path: NaN cm
为什么??我已经试着想了几个小时,但没有成功,也许有人有主意,我没有

谢谢! 萨米人

-------答案是在使用+操作数时解析每个变量-----------


var d_path=parseFloat(-d_drop)-parseFloat(sightHeight)+(parseFloat(drop_在零处)+parseFloat(sightHeight))*parseFloat(d_距离)/parseFloat(零范围)

如果任意一个操作数是字符串,加法运算符
+
将把对象转换为字符串。在使用这些输入之前,需要将所有输入(
d_uDrop
sighthelight
,等等)解析为数字

下面是一个演示
+
重载是如何工作的。请注意减法运算符
-
如何不重载,并且始终将操作数转换为数字:

var numberA = 1;
var numberB = 2;
var stringA = '3';
var stringB = '4';

numberA + numberB // 3 (number)
numberA - numberB // -1 (number)
stringA + stringB // "34" (string)
stringA - stringB // -1 (number)
numberA + stringB // "14" (string)
numberA - stringB // -3 (number)

如果任意一个操作数是字符串,则加法运算符
+
将把对象转换为字符串。在使用之前,您需要将所有输入(
d_drop
sighthelight
)解析为数字

下面是一个演示
+
重载是如何工作的。请注意减法运算符
-
如何不重载,并且始终将操作数转换为数字:

var numberA = 1;
var numberB = 2;
var stringA = '3';
var stringB = '4';

numberA + numberB // 3 (number)
numberA - numberB // -1 (number)
stringA + stringB // "34" (string)
stringA - stringB // -1 (number)
numberA + stringB // "14" (string)
numberA - stringB // -3 (number)

至少有一个数字是字符串
Sighthelight
是最有可能的罪魁祸首,因为它会与
drop\u at\u zero
连接,产生一个带有两个小数点的“数字”——这样的“数字”不是数字,因此
NaN


解决方案:使用
parseFloat(varname)
转换为数字。

至少有一个数字是字符串
Sighthelight
是最有可能的罪魁祸首,因为它会与
drop\u at\u zero
连接,产生一个带有两个小数点的“数字”——这样的“数字”不是数字,因此
NaN


解决方案:使用
parseFloat(varname)
将其转换为数字。

如果您使用
-d\u drop
作为变量名,这可能就是罪魁祸首。变量必须以字母开头

var     d_drop = -1.178791867393647,
  drop_at_zero = 0.0731037475605623,
   sightHeight = 4.5,
    d_distance = 40,
     zeroRange = 10;

var d_path = d_drop - sightHeight + (drop_at_zero + sightHeight) * d_distance / zeroRange;

console.log("Path: " + d_path + " cm"); // outputs: Path: 12.613623122848603 cm 

如果您使用
-d_drop
作为变量名,这可能就是罪魁祸首。变量必须以字母开头

var     d_drop = -1.178791867393647,
  drop_at_zero = 0.0731037475605623,
   sightHeight = 4.5,
    d_distance = 40,
     zeroRange = 10;

var d_path = d_drop - sightHeight + (drop_at_zero + sightHeight) * d_distance / zeroRange;

console.log("Path: " + d_path + " cm"); // outputs: Path: 12.613623122848603 cm 


您的一个变量不是数字(
NaN
)。您的变量来自哪里?如果它们来自文本输入,它们将被视为文本。这不是一个数字:09-11 18:15:00.420-它有冒号和连字符。你能用?@Neurofluxation复制它吗?我假设这是日志跟踪。你的变量中有一个不是数字(
NaN
)。你的变量来自哪里?如果它们来自文本输入,则被视为文本。这不是一个数字:09-11 18:15:00.420-它有冒号和连字符。你能用?@Neurofluxation复制它吗?我假设这是日志跟踪否我没有使用-d_drop作为变量,但d_drop:var d_dropNo我没有使用-d_drop作为变量,但d_drop:var d_dropvar d_path=parseFloat(-d_drop)-parseFloat(sightHeight)+(parseFloat(drop_在零处)+parseFloat(sightHeight))*parseFloat(d_距离)/parseFloat(零范围);我仍然不明白为什么我的函数返回true,但某些变量不是数字?您的连接解决方案听起来不错,但这真的很烦人:(var d_path=parseFloat(-d_drop)-parseFloat(sightHeight)+(parseFloat(drop_at_zero)+parseFloat(sightHeight))*parseFloat(d_distance)/parseFloat(zeroRange);我仍然不明白为什么我的函数返回true,但某些变量不是数字?您的串联解决方案听起来不错,但这真的很烦人:(非常感谢@jabey和Kolink。你们中谁是第一个回答这个问题的人?你们让我很开心!@Sami我相信我是第一个回答的,但Kolink的答案在我看来更好。我认为你们应该得到答案?虽然我不明白为什么会这样?我在计算之前仔细检查了一下,每个变量都不是string,它们是数字,但在使用+操作数时发生了一些事情?如果是这样,他的答案会更精确一点。@Sami当您将变量打印到控制台或其他可视输出时,它会自动转换为字符串表示形式,因此真的无法判断(没有
typeof
检查)这是一个字符串,这是一个数字。好吧,谢谢!我现在讨厌JS。所以我认为你应该得到答案,因为你是第一个:)非常感谢@jabey和Kolink。你们中谁是第一个回答这个问题的人?你让我开心了!@Sami我相信我是第一个回答的,但是Kolink的答案在我看来更好。我认为你应该得到答案?虽然我不明白为什么会这样?我在计算之前仔细检查了一下,每个变量都不是string,它们是数字,但在使用+操作数时发生了一些事情?如果是这样,他的答案会更精确一点。@Sami当您将变量打印到控制台或其他可视输出时,它会自动转换为字符串表示形式,因此真的无法判断(没有
typeof
检查)这是一个字符串,这是一个数字。好吧,谢谢!我现在讨厌JS。所以我认为你应该得到答案,因为你是第一个:)