0

我有几行代码在计算后产生一个数字,目前在 JavaScript 中,代码如下:

if ( y2 != y1 )
{
    // calculate rate
    var f;
    var y;
    if ( y2 > y1 )
    {
        f = cpi[y2] / cpi[y1];
        y = y2 - y1;
    }
    else
    {
        f = cpi[y1] / cpi[y2];
        y = y1 - y2;
    }           
    var r = Math.pow(f, 1/y);
    r = (r-1)*100;
    r = Math.round(r*100) / 100;
    System.out.println( "number: " + r.toFixed(2) + "%." );
}

我将上面的 JS 代码转换为 Java,代码如下:

DecimalFormat decimalFormat = new DecimalFormat("0.##");
    if (cpi[to] != cpi[from]) {
        double f, y;
        if (cpi[to] > cpi[from]) {
            f = cpi[to] / cpi [from];
            y = to - from;
        }
        else {
            f = cpi[from] / cpi[to];
            y = from - to;
        }
        q = Math.pow(f, 1/y);
        q = (q-1)*100;
        q = Math.round(q*100)/100;
        Toast.makeText(getApplicationContext(), "number: " + String.valueOf(decimalFormat.format(q)), 2000).show();
    }

JavaScript 代码产生:number: 2.39

当 Java 代码产生number: 2

为什么我得到两个不同的值?如果需要,我将发布 what cpi[to]、和values 。cpi[from]tofrom

4

4 回答 4

2

在这一行

q = Math.round(q*100)/100;

除法运算的两个操作数都是整数,因此结果也是整数类型。使用 100.0 作为除数将结果强制为double.

于 2013-10-10T20:12:35.853 回答
1

如果你在java中划分两个整数,结果是整数。使用双精度和整数或使用两个双精度的每个操作都会创建双精度。

1)在这一行

1)q = Math.round(q*100)/100;

2)您正在划分两个整数,因此它具有与以下相同的输出:

2)q = (int) (Math.round(q*100)/100);

3)您可以使用强制转换来加倍,例如:

3)q = Math.round(q*100)/(double)100;

4)或使用 100.0 使这个数字翻倍:

4)q = Math.round(q*100)/100.0;

5)这也应该有效,因为首先将 Math.round 的结果转换为双精度然后除以 100:

5)q = (double)Math.round(q*100)/100;

6)但是这将不起作用,因为第一个 Math.round 除以 100 并创建整数,因此此操作的结果向下舍入,然后转换为 double。所以它会是双倍的,但仍然向下舍入,因为它在变成双倍之前已经四舍五入了。

6)q = (double)(Math.round(q*100)/100);
于 2013-10-10T20:15:53.133 回答
1

什么是q型?尝试把 100.0 也

于 2013-10-10T20:15:06.170 回答
0

您的问题很可能是Math.round(double)返回long值。所以在那时d将包含 a而不是 double 。long

于 2013-10-10T20:24:35.117 回答