乘以幂时可能会损失精度?

时间:2012-04-24 21:56:45

标签: java binary precision exponent

所以我正在研究一个简单的二进制到十进制脚本,并且在乘以幂时可能会丢失精度时发生错误。这是所讨论的代码块,它所做的只是将1和0的二进制乘以2乘以字符串长度的功率减去循环经过的迭代次数。然后将结果添加到z,并重复。

public int decimal(String x){
    int z=0;
    for(int a=0;a<x.length();a++){
        z=z+Integer.parseInt(x.substring(a,a+1))*Math.pow(2,x.length()-a);
    }
    return z;
}

3 个答案:

答案 0 :(得分:4)

替换:

Math.pow(2,x.length()-a)

使用:

1 << (x.length() - a)

只要整数不溢出,你就会好起来的。您不必要地使用double s,更不用说Math.pow不是计算2的幂的最有效和直接的方法。

BTW是decimal()方法解析二进制字符串的全部要点?如果是这样,试试这个:

public int decimal(String x){
  return Integer.parseInt(x, 2);
}

是的,就是这样。

答案 1 :(得分:1)

我相信您将 double 乘以 int 并将值存储在 int 中。一些演员可能会修复它,试试这个;

public int decimal(String x){
    int z=0;
    for(int a=0;a<x.length();a++){
        z=z+(int)(Integer.parseInt(x.substring(a,a+1))*Math.pow(2,x.length()-a));
    }
    return z;
}

按位命令会加快这一步,并且不再需要完全投射:

public int decimal(String x){
    int z=0;
    for(int a=0;a<x.length();a++){
        z+=Integer.parseInt(x.substring(a,a+1)) << (x.length()-a);
    }
    return z;
}

答案 2 :(得分:0)

您有一个错误的错误。该函数返回的值应该是应有的两倍。例如,decimal("1") == 2。将其更改为Math.pow(2,x.length()-1-a)

但是由于结果是一个整数,所以最好用整数类型做所有事情,所以像其他人说的那样使用左移。

你甚至不需要计算两个人的权力。您可以每次将部分结果乘以2。

public int decimal(String x) {
    int z=0;
    for (int a = 0; a < x.length(); a++) {
        z = 2 * z + Integer.parseInt(x.charAt(a));
    }
    return z;
}