【问题标题】:Why does my JS "if" statement always evaluate to false?为什么我的 JS "if" 语句总是评估为假?
【发布时间】:2015-02-12 16:31:39
【问题描述】:

我的代码:

if (calculatedColumn5 >= calculatedColumn) {
'Enough credits.'
}
{
'Not enough credits.'
}

即使“calculatedColumn5”明显大于“calculatedColumn”,也会评估为“信用不足”。

我什至试过这个:

if (calculatedColumn5 >= calculatedColumn) {
'Enough credits.'
}
else if (calculatedColumn5 < calculatedColumn)
{
'Not enough credits.'
}
else {
''
}

...它总是评估为''!那么我的“if”条件是否存在问题,它们总是评估为假?

顺便说一下,变量(calculatedColumn5和calculatedColumn)都是十进制值。

【问题讨论】:

  • 那么,calculatedColumn5 和 calculatedColumn 的值是多少?如何获得它们?
  • 请注意,您的第一个代码 sn-p 缺少“else”,使得第二个块无条件。
  • calculatedColumn5 和 calculatedColumn 的类型是什么确保它们是 int 或 float,而不是字符串,否则每个都使用 parseFloat?此外,“足够的学分”在 javascript 中无效。你应该更喜欢alert('enough credits'); 或console.log('enough credits');。此外,在第一个代码中缺少一个“else”。
  • @briosheje 使用表达式作为语句是有效的 Javascript(这就是“使用严格”的工作方式)。它只是没有做任何事情。
  • SO 不是调试器。在此处询问之前,您应该在诸如 firebug 或 chromes 内部的调试环境中运行您的代码。如果这样做,请确保提供人们可能需要的所有东西。在您的情况下,值的来源。

标签: javascript if-statement comparison-operators


【解决方案1】:

也许这些值实际上是字符串,并且正在作为字符串进行比较。

尝试使用:

if (parseFloat(calculatedColumn5) >= parseFloat(calculatedColumn)) {

【讨论】:

  • 我试过了,但没用。我还尝试将计算字段更改为 value.parseFloat,这可能不是正确的措辞,但它评估为 null。
  • 无论如何,如果 (parseFloat(calculatedColumn5) >= parseFloat(calculatedColumn)) { '足够的学分。' } { '没有足够的学分。' } - 仍然总是评估为“没有足够的学分”。
  • 您忘记了提到的“错误”一词。还有你在用这些字符串做什么,你可能想要 console.log('Enough credits');
【解决方案2】:

请记住,在 JS 中,未定义(未初始化)变量的计算结果为 false。请尝试以下操作:

var a;
if (a) console.log('True'); else console.log('False');

评估为假。

对未定义值执行的任何逻辑运算也是如此。

var a;
var b = 5;
if (a > b) console.log('greater'); else console.log('lower or equal');

评估为假。

【讨论】:

  • 我相信属性定义正确(尽管它们的数据类型可能存在问题?)。我正在 Intrinsik Informer 中编写脚本列 - 其他计算列可以毫无问题地用于公式中。
  • 如果你调试并且所有操作数都有值......那么我没有解决你的问题:-)
【解决方案3】:

您应该四舍五入或至少去掉小数以避免不必要的行为。请看https://stackoverflow.com/a/18741293/2192152

还有:

// Test if ===, or greated
if (calculatedColumn5 >= calculatedColumn) {
'Enough credits.'
}
// Test if strictly inferior
else if (calculatedColumn5 < calculatedColumn)
{
'Not enough credits.'
}
// this will NEVER fire as all other cases have been tested.
else {
''
}

编辑: 这是有效的。假设 2 小数,但你可以乘以 100,1000 或任何你需要的。 (您甚至可以通过拆分 a 变量并确定句点后面的长度来自动执行此操作。

var a = 12.21;
var b = 12.35;
a = Math.round(a * 100);
b = Math.round(b * 100);

var test = a > b ? 'A > B' : 'A < B';

alert(test);

【讨论】:

  • 仍在消化每个人的 cmets - 但是当一些学生有半个学分时,我该如何四舍五入或去掉小数点?让我试试 if (parseInt(2*calculatedColumn5) >= parseInt(2*calculatedColumn)) { '足够的学分。' } else { '没有足够的学分。' }...
  • 那个代码有同样的问题;它似乎总是评估为假。
  • 您不能只是截断数字并假设它会起作用。数字的小数部分在这里非常重要。
  • @ssube 正确,但我们这里缺少一些信息。给定数据,最好的解决方案是让我确定小数点后有多少个数字,(X),然后做一个数字=数字*(10 * X)。然后简单地比较它们。有点丑但是很好..
猜你喜欢
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 2014-03-14
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
相关资源
最近更新 更多