Javascript模数

时间:2013-01-11 04:47:43

标签: javascript html

我想知道Javascript如何处理模数。例如,Javascript评估47%8?谢谢。我似乎无法找到任何文档,我的模数技能不是最好的...谢谢!

5 个答案:

答案 0 :(得分:5)

正如每种语言处理模数一样:X / Y的其余部分。

47 % 8 == 7

此外,如果您使用Firefox + Firebug,Safari,Chrome甚至IE8 +等浏览器,您可以像点击F12一样快速测试此类操作。

答案 1 :(得分:0)

Modulo的行为应该与您期望的一样。我期待。

47 % 8 == 7

Fiddle Link

答案 2 :(得分:0)

JavaScript没有模运算符

实际上在JavaScript中,%运算符不是模数。它只返回除法的其余部分。

警告这有一个细微的差别......我会在下面解释一下。

为什么要关心?

成功实施科学计算或算法不仅可以通过了解特定语言或框架提供的功能,还可以了解其局限性。

计算机是精确的科学仪器,但它们通过操纵离散空间中的实体来工作(屏幕上的像素数量有限,每个数字后面的位数有限,等等。)

尝试忽略限制或框架规范,很快您就会发现数学公式与您尝试编写的代码之间存在阻抗不匹配。

%运算符

有时,错误地宣传或理解框架功能或操作员会使情况变得复杂。本文重点介绍模运算符。

询问任何C#或JavaScript程序员他们的语言中的模运算符是什么,他们很可能会回答:%(例如百分号)。大量文档将%符号称为模运算符。

哇!这是一个微妙但非常危险的错误。在C#和JavaScript中,%运算符实际用于计算当一个操作数除以第二个操作数时剩余的余数(带符号)。因此,操作数应正确地称为有符号余数运算符。

乍一看,带符号的余数运算符的功能与模运算符类似。让我们通过将JavaScript返回的结果与Google返回的结果进行比较来进行一些测试。

在Chrome中,打开控制台(按F12并选择控制台选项卡)。从左列开始逐个输入。接下来在Google搜索栏中输入相同的表达式。注意结果。它们应该是一样的。

                JavaScript  Google
    5 % 3       2           2
    26 % 26     0           0
    15 % 12     3           3

现在让我们尝试使用负值作为第一个操作数:

enter image description here

惊喜!

-5%3 = 1(根据Google) -5%3 = -2(根据JavaScript)

嗯......如果我们看一下JavaScript中的%运算符(或者甚至是C#或许多其他语言)的定义,这实际上不应该是一个惊喜。 Google会计算真正的模数,而这些计算机语言会计算签名提醒。

但是,并非所有编程语言/框架都具有相同的%实现。例如,在Python中,%运算符以与Google相同的方式计算真模数。

enter image description here

语言之间的这种行为差异可能会在计算中引入细微的错误,尤其是当您尝试将算法从一种语言移植到另一种语言时!

理解的问题是问题解决了一半

假设我们需要使用模运算在JavaScript中实现(科学)计算。

由于我们现在明白JavaScript没有真正的模运算符,我们可以很容易地将模运算作为函数来实现。

有多种方法可以在JavaScript中实现modulo。我将向您展示3种方法。

// Implement modulo by replacing the negative operand 
// with an equivalent positive operand that has the same wrap-around effect
function mod(n, p)
{
    if ( n < 0 )
        n = p - Math.abs(n) % p;

    return n % p;
}

// Implement modulo by relying on the fact that the negative remainder
// is always p numbers away from a positive reminder
// Ex: -5 % 3 | -5 = -2 * 3 + 1 and -5 = -1 * 3 + (-2) | -2 + 3 = 1  
function mod(n, p)
{
    var r = n % p;

    return r < 0 ? r + p : r;
}

// Implement modulo by solving n = v * p + r equation  
function mod(n, p) 
{
    return n - p * Math.floor( n / p );
}

我们可以使用更精确的工具,现在我们已准备好解决(科学)计算,并期望每次都能获得正确的结果。

注意:有很多计算使用模运算...如果你想看看如何在Caesar Cipher / ROT13代码的实现中使用这些新的模数函数,你可以检查这个article。 / p>

答案 3 :(得分:0)

当给定负数作为输入时(在左侧),Javascript的模运算符将返回负数。

14 % 5 // 4
15 % 5 // 0
-15 % 5 // -0
-14 % 5 // -4

(注意:负零在JavaScript和其他带有IEEE浮点数的语言中是一个不同的值,但是-0 === 0因此,您通常不必担心它。)

如果希望数字始终在0到指定的正数之间,则可以定义如下函数:

function mod(n, m) {
    return ((n % m) + m) % m;
}
mod(14, 5) // 4
mod(15, 5) // 4
mod(-15, 5) // 0
mod(-14, 5) // 1

comparison of remainder and modulo

答案 4 :(得分:0)

为了更好地理解模数,它是如何构建的;

function modulo(num1, num2) {
    if (typeof num1 != "number" || typeof num2 != "number"){
      return NaN
    }
    var num1isneg=false
     if (num1.toString().includes("-")){
      num1isneg=true
    }
      num1=parseFloat(num1.toString().replace("-",""))
      var leftover =parseFloat( ( parseFloat(num1/num2) - parseInt(num1/num2)) *num2)
      console.log(leftover)
            if (num1isneg){
              var z = leftover.toString().split("")
              z= ["-", ...z]
              leftover = parseFloat(z.join(""))
            }
            return leftover
}