JavaScript - 产生两半的分裂

JavaScript - Generating divisions in halves

我有以下 JavaScript 代码:

var expressionBuilder = function() {
    var firstNumber = getRandomInt(1, 10);
    var secondNumber = getRandomInt(1, 10);
    var operand = getRandomOperator();

    if (operand === '-') {
        do {
            firstNumber = getRandomInt(1, 10);
            secondNumber = getRandomInt(1, 10);     
        } while (firstNumber < secondNumber);
    }

    if (operand === '/') {
        do {
            firstNumber = getRandomInt(1, 10);
            secondNumber = getRandomInt(1, 10);     
        } while (firstNumber < secondNumber && ((firstNumber / secondNumber) % 0.5) != 0);
    }

    return firstNumber + ' ' + operand + ' ' + secondNumber;
};

这是不言自明的。除法位应该生成数字,这样我只会得到除法结果,如 0.5、1、1.5 等:

((firstNumber / secondNumber) % 0.5) != 0

能被1/2整除。然而,我仍然得到像 8/7 这样的表达。为什么?

这行看起来像是对 &&|| 的简单误解:

while (firstNumber < secondNumber && ((firstNumber / secondNumber) % 0.5) != 0);

只有当两个语句的计算结果为真时,循环才会继续。让我们以您的 8/7 为例:

while (8 < 7 && ((8 / 7) % 0.5) != 0);

8 < 7 的计算结果为 false。因此循环 不会 继续,并且这些数字已设置。

你很想||;如果这些陈述中的任何一个为真,您希望它继续。两者都不是。

while (firstNumber < secondNumber || ((firstNumber / secondNumber) % 0.5) != 0);

您有:

firstNumber < secondNumber && ((firstNumber / secondNumber) % 0.5) != 0)

正如您所指出的,它允许通过 firstNumber == 8secondNumber == 7

此组合未满足您 while 中的第一个条件,而第二个条件(%)甚至从未计算过。

这就是&&(and)的本质。

看来我知道你在做什么,你想继续循环生成的数字,直到你可以避免 while 条件中所述的失败条件。

让我们评估语法问题:

while (firstNumber < secondNumber && ((firstNumber / secondNumber) % 0.5) != 0)

以8/7为例,即firstNumber = 8,secondNumber = 7 成为

while (8 < 7 && ((8 / 7) % 0.5) != 0)

do while 会一直循环直到条件为假,所以让我们一一检查。

8 < 7 will return false

此外,您正在使用 && 条件,如果一个条件失败,它将使整个语句为假。

你需要你的两个陈述都是假的。所以选择是使用 OR 运算符,只有当两个条件都为 false 时,OR 才取 false。

您的解决方案可能是:

while (8 < 7 || ((8 / 7) % 0.5) != 0)

我给你的笔记是,当你避免特定条件或搜索特定条件时,逻辑略有不同。