我的 Javascript 和 Python 代码是不是因为指数或其他原因给了我不同的答案?

Posted

技术标签:

【中文标题】我的 Javascript 和 Python 代码是不是因为指数或其他原因给了我不同的答案?【英文标题】:Are my Javascript and Python code giving me different answers because of exponents, or something else?我的 Javascript 和 Python 代码是否因为指数或其他原因给了我不同的答案? 【发布时间】:2020-02-10 22:08:28 【问题描述】:

我已经将一个简单的算法从 Python3 移植到 javascript,但令人惊讶的是,我得到了不同的答案。 Python 代码按预期工作,我不知道为什么 Javascript 行为不同。

这是 Python:

def foo():
    theArray = [1,2,3,4,5,6]
    a = theArray[0]
    b = theArray[1]
    c = theArray[2]
    d = theArray[3]
    e = theArray[4]
    f = theArray[5]
    res = (((a**2 + b**2 - (d - e)^3 + (b//e)^2)/ ((a**2 + b**2 - (d - e)^3) + c**2 + (f-4)^2 + (c//d)^2))*0.75)
    return res

Python3 结果:0.32..

这是 Javascript 代码:

function foo() 
    theArray = [1,2,3,4,5,6]
    var a, b, c, d, e, f
    a = theArray[0]
    b = theArray[1]
    c = theArray[2]
    d = theArray[3]
    e = theArray[4]
    f = theArray[5]
    res = (((a**2 + b**2 - (d - e)**3 + (b/e)**2)/ ((a**2 + b**2 - (d - e)**3) + c**2 + (f-4)**2 + (c/d)^2))*0.75)
    return res

Javascript 结果:0.27..

在 Javascript 代码中使用 Math.pow() 并没有改变任何东西。

【问题讨论】:

你会想要阅读 Javascript 和浮点运算 我看到了浮点问题,但我认为这不是问题所在。如果你在数组中使用不同的测试用例/不同的值,真正的问题会变得更加明显。 见***.com/questions/1458633/… b//ec//d 在 Python 中进行整数除法并将结果向下舍入为零。你可能想要 b/ec/d 代替 【参考方案1】:

请注意,它们不是相同的公式。

在你的 python 代码中你有:

res = (((a**2 + b**2 - (d - e)^3 + (b//e)^2) / ((a**2 + b**2 - (d - e)^3) + c**2 + (f-4)^2 + (c//d)^2))*0.75

其中有 (d - e)^3(b//e)^2(f-4)^2

在你的 js 代码中你有:

res = (((a**2 + b**2 - (d - e)**3 + (b/e)**2) / ((a**2 + b**2 - (d - e)**3) + c**2 + (f-4)**2 + (c/d)^2))*0.75)

取而代之的是 (d - e)**3(b//e)**2(f-4)**2

XOR 运算是与指数非常不同的运算。

另外,请注意在 python 中你有很多整数除法。在 javascript 中,等价物类似于:

(Math.floor(b/e))^2

所以正确的js公式应该是:

res = (((a**2 + b**2 - (d - e)^3 + Math.floor(b/e)^2) / ((a**2 + b**2 - (d - e)^3) + c**2 + (f-4)^2 + Math.floor(c/d)^2))*0.75

【讨论】:

当然假设你的python公式是正确的【参考方案2】:

我注意到的第一件事是您有时使用“**”进行求幂,有时使用“^”。前者是你应该为 python 和 javascript 使用的(或者至少根据 w3 学校,但无论如何它们对我产生不同的结果) 我假设您不是要使用按位“XOR”运算符,而是在编写“^”时使用指数,因为您在 python 和 js 中都键入了不同的符号......

当我将计算机上的所有“^”实例更改为“**”时,两种算法都返回 0.2361

【讨论】:

以上是关于我的 Javascript 和 Python 代码是不是因为指数或其他原因给了我不同的答案?的主要内容,如果未能解决你的问题,请参考以下文章

通过 Django 将 Python 数据传递给 JavaScript

通过 Websocket 用 Python 控制 Javascript/CSS 元素?

Beautifulsoup python获取页面的日期和作者

在 python 和 javascript 中运行相同的代码

Python 3.5 - 如何对javascript呈现的页面进行webscraping

Pylama python和javascript的代码审计工具