【问题标题】:Issues with adding doubles. Arithmetic Coding添加双打的问题。算术编码
【发布时间】:2015-08-23 08:23:57
【问题描述】:

所以,基本上我有这个算法,它使用算术编码对单词进行编码。带有百分比(String[][] tabelaProbs 和单词 (String palavra) 的矩阵如下:

矩阵:

 String tabelaProbs[][] = {{"A", "E", "I", "O", "U", "!"},{"0.2", "0.3", "0.1", "0.2", "0.1", "0.1"}};

单词:

String palavra = "EAII!"; (in lower case: " e a i i ! ")

问题是,它给了我错误的结果,因为一些双打的总和给出了错误的结果,这也影响了最终结果。 最终结果(credencialCodificada)预计为:0.23354

有人可以帮忙吗?

   public static double codificarCredenciaisAcesso(String[][] tabelaProbs, String palavra) {
    double  aux = 0;
    String letra, palavraAux = "";
    int indice = 0;

    double[] probabilidadesAux = new double[tabelaProbs[1].length + 2];
    probabilidadesAux[0] = 0;
    for (int i = 0; i < tabelaProbs[1].length; i++) {
        aux += Double.parseDouble(tabelaProbs[1][i].trim());
        probabilidadesAux[i + 1] = aux;
    }
    probabilidadesAux[probabilidadesAux.length - 1] = 1;


    for (int indiceLetra = 0; indiceLetra < palavra.length(); indiceLetra++) {
        letra = palavra.charAt(indiceLetra) + "";
        palavraAux += letra;


        for (int iProb = 0; iProb < tabelaProbs[0].length; iProb++) {
            if (letra.equalsIgnoreCase(tabelaProbs[0][iProb])) {
                indice = iProb;
                break;
            }
        }

        double intervaloProb = probabilidadesAux[indice + 1] - probabilidadesAux[indice];
        for (int i = 0; i < probabilidadesAux.length; i++) {
            if (indice == i) {
                probabilidadesAux[0] = probabilidadesAux[indice];
                probabilidadesAux[probabilidadesAux.length - 1] = probabilidadesAux[indice + 1];
                aux = probabilidadesAux[0];
                for (int j = 1; j < probabilidadesAux.length - 1; j++) {
                    double probabilidadeX = Double.parseDouble(tabelaProbs[1][j - 1]);
                    probabilidadesAux[j] = aux + (probabilidadeX * intervaloProb);
                    aux = probabilidadesAux[j];
                }
                break;
            }
        }
    }
    double credencialCodificada = probabilidadesAux[indice];

    return credencialCodificada;
}

【问题讨论】:

  • 你的调试器显示了什么?
  • 在某些总结中,它给出了错误的结果。例如,如果将 0.1 + 0.2 相加,则结果不会是 0.3,而是类似于 0.30000004。它看起来很小,但会影响最终结果

标签: java math double


【解决方案1】:

例如,如果将 0.1 + 0.2 相加,则结果不会是 0.3,而是类似于 0.30000004。它看起来很小但会影响最终结果

如果您想要任意精度的浮点值,我建议您使用 BigDecimal,这是 java.math 中的一个类。更多详情here()

【讨论】:

    【解决方案2】:

    问题在于双精度数小于它们的总大小。所以 3.0000004 精确到小数点后 4 位,但比小数点后 4 位要长。

    这也是为什么您应该避免按双打进行比较或分组的原因。

    这是一个讨论类似内容的链接: how to fix double precision issue in java

    【讨论】:

    • 那你有什么建议?
    • 底部的链接解释了它,如果你真的需要,另一个答案都建议使用 BigDecimal
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 2010-10-08
    • 2018-04-19
    相关资源
    最近更新 更多