Java双增量

时间:2012-02-23 13:21:39

标签: java ieee-754

我有一个双变量

public double votes(){
    double votexp = 0;

      for(Elettore e:docenti.values()){
        if(e.getVoto()==true)          //everytime this is true increment by 1
        {
            votexp+=1.0;
        }   
    }
    for(Elettore e:studenti.values()){
        if(e.getVoto()==true)         //everytime this is true increment by 0.2
        {
            votexp+=0.2;
        }
    }
    for(Elettore e:pta.values()){
        if(e.getVoto()==true)        //everytime this is true increment by 0.2
        {
            votexp+=0.2;
        }
    }
    return votexp;
}

在我的情况下,变量应增加到2.6,但votexp返回2.6000000000000005 我如何通过使用相同的双变量并返回双精度数来解决这个问题?

5 个答案:

答案 0 :(得分:6)

您正在累积舍入错误。最简单的方法是使用long(或int,最后只使用一个double。(或者BigDecimal,最后加倍,但这太复杂了)

public double votes() {
    long votexp = 0;
    for (Elettore e : docenti.values())
        if (e.getVoto())          //everytime this is true increment by 1
            votexp += 10;
    for (Elettore e : studenti.values())
        if (e.getVoto())         //everytime this is true increment by 0.2
            votexp += 2;
    for (Elettore e : pta.values())
        if (e.getVoto())        //everytime this is true increment by 0.2
            votexp += 2;
    return votexp / 10.0;
}

double a = 26 / 10.0;
System.out.println(a);

打印

2.6

由于Double.toString()“知道”值可能不精确,因此会进行少量舍入。这种舍入是有限的,因此操作两个double的结果可能会有一个太大而无法隐藏的错误。如果你正确地舍入你的最后一个结果,错误将足够小,不会导致问题。

答案 1 :(得分:2)

尝试使用java.math.BigDecimal类。

答案 2 :(得分:0)

你必须对结果进行舍入,Java中的浮点数(基本上所有其他环境)都完美,有时会出现小的不准确性。

如果你正在处理十进制数字,那就是BigDecimal,它可以准确地代表你所展示的内容(它不能精确地代表其他事情,如1 / 3)。

或者,您可以乘以10,使用Math.round,如果问题与实际结束值不一致,则除以10,但是在您'期间悄悄进入时会出现不准确的问题我们建立了这种价值。那个发生就像是这样构建的2.6:

double n = 0;

n += 1;
n += 0.2;
n += 1;
n += 0.2;
n += 0.2;

System.out.println("n = " + n);     // "2.6000000000000005"
n = (double)Math.round(n * 10) / 10;
System.out.println("n = " + n);     // "2.6"

...但我认为并不能保证所有价值都必须如此。 (我不是浮点大师。)

通过将输出结果截断到适当的精度级别,输出结果时,

只会担心它。

答案 3 :(得分:0)

某些数字不能完全用双精度浮点格式表示。看起来计算中的中间数字有这个缺陷,它包含在最终结果中。

答案 4 :(得分:0)

你可以试试这个

(double)Math.round(value * 10) / 10

但是通过添加像这样的双打

你永远不会得到好结果