Java pythonv3.5.2和v2.7.12中的结果不同,但是v2.7.12是正确的吗?

Java pythonv3.5.2和v2.7.12中的结果不同,但是v2.7.12是正确的吗?,java,python,long-integer,biginteger,Java,Python,Long Integer,Biginteger,在我的问题开始之前,我要说,我知道在Python3周围,“无限长”被集成到int中,因此Python中的int可以有效地与RAM一样大 我正在比较Java和Python。 下面是一个Python和Java程序。他们做同样的事情 Python: def answer(n): count = 0 t = int(n) while (t!=1): t = t+1 if (t%2==1) else t/2 count += 1 return

在我的问题开始之前,我要说,我知道在Python3周围,“无限长”被集成到int中,因此Python中的int可以有效地与RAM一样大

我正在比较Java和Python。 下面是一个Python和Java程序。他们做同样的事情

Python:

def answer(n):
    count = 0
    t = int(n)
    while (t!=1):
        t = t+1 if (t%2==1) else t/2
        count += 1
    return count
爪哇:

然后我编写了一个简单的bash脚本来运行java和python(版本分别为2.7.12和3.5.2),并比较了它们的输出

#!/bin/bash
    i=$1
    a=`java    Solution    $i`
    b=`python  Solution.py $i`
    c=`python3 Solution.py $1`

    echo "INPUT: $1"
    echo ""
    echo "LANGUAGE: VERSION:  RESULT:"
    echo "--------  --------- ------"
    echo "Java      1.8.0_151   $a"
    echo "Python    2.7.12      $b"
    echo "Python3   3.5.2       $c"
下面是一些运行示例。结果列是最重要的

INPUT: 123

LANGUAGE: VERSION:  RESULT:
--------  --------- ------
Java      1.8.0_151   9
Python    2.7.12      9
Python3   3.5.2       9


INPUT: 123456789

LANGUAGE: VERSION:  RESULT:
--------  --------- ------
Java      1.8.0_151   39
Python    2.7.12      39
Python3   3.5.2       39


INPUT: 12345678998765

LANGUAGE: VERSION:  RESULT:
--------  --------- ------
Java      1.8.0_151   61
Python    2.7.12      61
Python3   3.5.2       61


INPUT: 123456789987654321

LANGUAGE: VERSION:  RESULT:
--------  --------- ------
Java      1.8.0_151   84
Python    2.7.12      84
Python3   3.5.2       82
所以它们几乎都会产生相同的结果,直到输入足够大,然后你可以看到最后一个,结果是不同的。几乎每一个比这个大的数字都会产生不同的结果

Python3的int和Java的biginger不应该得到相同的结果吗

pythonv.2不应该得到不同的结果吗

哪一个是错误的,为什么?Java和Python3还是PythonV.2.7.12


我如何纠正错误以获得正确的输出?

问题实际上与Python 2中整数文本的限制无关。那只不过是转移视线而已。真正的问题是除法运算符
/
在Python2中的行为与Python3中的不同

:

当前除法(/)运算符对于数值参数的含义不明确:如果参数为int或long,则返回除法数学结果的下限;如果参数为float或复数,则返回除法结果的合理近似值。这使得期望浮点或复杂结果的表达式在不期望整数但可能作为输入时容易出错

我们建议通过为不同的操作引入不同的运算符来解决这个问题:x/y返回除法数学结果的合理近似值(“真除法”),x//y返回下限(“下限除法”)。我们称x/y的当前混合含义为“经典划分”

由于严重的向后兼容性问题,更不用说c.l.py上的一个主要flamewar了,我们提出了以下过渡措施(从Python 2.2开始):

  • 在Python2.x系列中,Classic除法仍然是默认的; 真正的除法在Python 3.0中是标准的

  • //操作员可以请求楼层划分
    毫不含糊地

  • future division语句,由
    \uuuuu future\uuuuu导入
    除法
    ,将把
    /
    运算符更改为整个过程中的真正除法 模块

  • 命令行选项将为classic启用运行时警告
    用于整型或长型参数的除法;另一个命令行
    选项将使“真除法”成为默认值

  • 标准库将使用未来的division语句和
    /
    操作员,以完全避免经典
    分部

因此,如果希望Python代码在输入为
123456789987654321
时正确运行,则需要使用楼层分割运算符
/

def应答(n):
计数=0
t=int(n)
而t!=1:
t=t+1如果(t%2==1)其他t//2
计数+=1
返回计数

您得到的答案不同,因为除法运算符在Python 2中和Python 3中的行为不同。尝试改用
/
。你应该得到
84
。换句话说:哪一个是错的?测试是错误的。有了这个补丁,同样的代码可以在Python2和Python3下正确运行:)是的,谢谢,@user2357112。我的意思是地板分割不是真正的分割。谢谢,这让我发疯了。我想我看的方向完全错了。
INPUT: 123

LANGUAGE: VERSION:  RESULT:
--------  --------- ------
Java      1.8.0_151   9
Python    2.7.12      9
Python3   3.5.2       9


INPUT: 123456789

LANGUAGE: VERSION:  RESULT:
--------  --------- ------
Java      1.8.0_151   39
Python    2.7.12      39
Python3   3.5.2       39


INPUT: 12345678998765

LANGUAGE: VERSION:  RESULT:
--------  --------- ------
Java      1.8.0_151   61
Python    2.7.12      61
Python3   3.5.2       61


INPUT: 123456789987654321

LANGUAGE: VERSION:  RESULT:
--------  --------- ------
Java      1.8.0_151   84
Python    2.7.12      84
Python3   3.5.2       82