有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaScript到标准Java的转换问题

我有一个JavaScript方法,我需要在标准Java中转换它,但我对行有一点问题

if (jsum) sum += bj;
jsum=!jsum;

return x < 0.0 && (n & 1) ? -ans : ans;

显示错误:运算符未定义。 我知道我不能在Java中使用这种语法,但我还不明白什么是正确的语法,可以在没有问题的情况下保持最初的目的

完整的JS方法是

function bessel_fkb(n,x)
{ 
    if (n == null || n.length == 0) return "n not specified";
    var iac = 40.0;     
    var bigno = 1.0e10;
    var bigni = 1.0e-10;
    var j,jsum,m,ax,bj,bjm,bjp,sum,tox,ans;
    ax=Math.abs(x);
    if (ax == 0.0) return 0.0;
    else if (ax > n) {
        tox = 2.0/ax;
        bjm=BesselJ0(ax);
        bj=BesselJ1(ax);
        for (j=1;j<n;j++) {
            bjp=j*tox*bj-bjm;
            bjm=bj;
            bj=bjp;
        }
        ans=bj;
    } else {
        tox=2.0/ax;
        if (Math.sqrt(iac*n) >= 0)
            m=2*((n + Math.floor(Math.sqrt(iac*n))) / 2);
        else
            m=2*((n + Math.ceil(Math.sqrt(iac*n))) / 2);
        jsum=0;
        bjp=ans=sum=0.0;
        bj=1.0;
        for (j=m;j>0;j--) {
            bjm=j*tox*bj-bjp;
            bjp=bj;
            bj=bjm;
            if (Math.abs(bj) > bigno) {
                bj *= bigni;
                bjp *= bigni;
                ans *= bigni;
                sum *= bigni;
            }
            if (jsum) sum += bj;
            jsum=!jsum;
            if (j == n) ans=bjp;
        }
        sum=2.0*sum-bj;
        ans /= sum;
    }
    return x < 0.0 && (n & 1) ? -ans : ans;     
}

我的完整Java转换尝试是:

public double bessel_fkb(double n, double x)
    { 
        double iac = 40.0;      
        double bigno = 1.0e10;
        double bigni = 1.0e-10;
        double jsum,m,ax,bj,bjm,bjp,sum,tox,ans;
        ax=Math.abs(x);
        if (ax == 0.0) return 0.0;
        else if (ax > n) {
            tox = 2.0/ax;
            bjm=BesselJ0(ax);
            bj=BesselJ1(ax);
            for (int j=1;j<n;j++) {
                bjp=j*tox*bj-bjm;
                bjm=bj;
                bj=bjp;
            }
            ans=bj;
        } else {
            tox=2.0/ax;
            if (Math.sqrt(iac*n) >= 0)
                m=2*((n + Math.floor(Math.sqrt(iac*n))) / 2);
            else
                m=2*((n + Math.ceil(Math.sqrt(iac*n))) / 2);
            jsum=0;
            bjp=ans=sum=0.0;
            bj=1.0;
            for (int j=(int)m;j>0;j--) {
                bjm=j*tox*bj-bjp;
                bjp=bj;
                bj=bjm;
                if (Math.abs(bj) > bigno) {
                    bj *= bigni;
                    bjp *= bigni;
                    ans *= bigni;
                    sum *= bigni;
                }
                if (jsum) sum += bj;
                jsum=!jsum;
                if (j == n) ans=bjp;
            }
            sum=2.0*sum-bj;
            ans /= sum;
        }
        return x < 0.0 && (n & 1) ? -ans : ans;     
    }

共 (4) 个答案

  1. # 1 楼答案

    注意n可能是int型而不是double,并且jsum最可能是int型或boolean

    下面的答案假设nintjsumboolean

    在JavaScript中:

    jsum = 0;
    ...
    if (jsum) sum += bj;
    jsum = !jsum;
    

    在Java中:

    jsum = false;
    ...
    if (jsum) sum += bj;
    jsum = !jsum;
    

    在JavaScript中:

    return x < 0.0 && (n & 1) ? -ans : ans;
    

    在Java中:

    return x < 0.0 && (n & 1) != 0 ? -ans : ans;
    

    如果n实际需要类型double,那么在对1执行逐位和&操作之前,必须将n大小写为long

    因为Java有严格的类型,所以最好弄清楚实际使用情况并相应地使用类型

  2. # 2 楼答案

    这:

    if (jsum) sum += bj;
    

    应该是:

    if (jsum > 0) sum += bj; // or != 0
    

    你必须引入一个明确的比较

    这是:

        return x < 0.0 && (n & 1) ? -ans : ans;     
    

    应该是:

        return x < 0.0 && ((long) (n & 1) == 1) ? -ans : ans;     
    

    JavaScript在适当的上下文中执行非布尔类型的隐式转换,但Java不执行。(编辑啊,哎呀,必须先转换成long或其他东西)

    当然,从doublelong的转换不一定有意义。如果JavaScript代码可以工作,那么它应该是正常的。当然,如果可以的话,你可以重新做一次,把“n”变成一个整数(或长)

  3. # 3 楼答案

    您不能这样写:

    return x < 0.0 && (n & 1) ? -ans : ans; 
    

    因为(n&1)在Java中不是有效的操作,因为n是双精度的,所以在JavaScript中,您可以通过这种方式测试n是否是奇数,所以您只需编写:

    if(x<0.0 && (int)n%2!=0){
       return -ans;
    }
    else{
       return ans;
    }
    

    编辑:

    您误解了jsum角色,无法将var jsum视为double,在Java中必须是boolean

     if (jsum) sum += bj;
                jsum=!jsum;
    

    毫无意义jsum作为双重

  4. # 4 楼答案

    参数应该是int,我看到的jsum sum像布尔值一样使用

    试试看:

    public double bessel_fkb(int n, double x)
    { 
        double iac = 40.0;      
        double bigno = 1.0e10;
        double bigni = 1.0e-10;
        double m,ax,bj,bjm,bjp,sum,tox,ans;
        boolean jsum;
        ax=Math.abs(x);
        if (ax == 0.0) return 0.0;
        else if (ax > n) {
            tox = 2.0/ax;
            bjm=BesselJ0(ax);
            bj=BesselJ1(ax);
            for (int j=1;j<n;j++) {
                bjp=j*tox*bj-bjm;
                bjm=bj;
                bj=bjp;
            }
            ans=bj;
        } else {
            tox=2.0/ax;
            if (Math.sqrt(iac*n) >= 0)
                m=2*((n + Math.floor(Math.sqrt(iac*n))) / 2);
            else
                m=2*((n + Math.ceil(Math.sqrt(iac*n))) / 2);
            jsum=false;
            bjp=ans=sum=0.0;
            bj=1.0;
            for (int j=(int)m;j>0;j--) {
                bjm=j*tox*bj-bjp;
                bjp=bj;
                bj=bjm;
                if (Math.abs(bj) > bigno) {
                    bj *= bigni;
                    bjp *= bigni;
                    ans *= bigni;
                    sum *= bigni;
                }
                if (jsum) sum += bj;
                jsum=!jsum;
                if (j == n) ans=bjp;
            }
            sum=2.0*sum-bj;
            ans /= sum;
        }
        return x < 0.0 && ((n & 1) != 0) ? -ans : ans;     
    }