java中带double的浮点保留精度

imzjd6km  于 2021-06-30  发布在  Java
关注(0)|答案(22)|浏览(401)
public class doublePrecision {
    public static void main(String[] args) {

        double total = 0;
        total += 5.6;
        total += 5.8;
        System.out.println(total);
    }
}

上面的代码打印:

11.399999999999

我怎样才能把它打印出来(或者作为11.4使用)?

p1tboqfb

p1tboqfb16#

使用java.math.bigdecimal
double在内部是二进制分数,所以它们有时不能精确地表示十进制分数。

b5buobof

b5buobof17#

private void getRound() {
    // this is very simple and interesting 
    double a = 5, b = 3, c;
    c = a / b;
    System.out.println(" round  val is " + c);

    //  round  val is  :  1.6666666666666667
    // if you want to only two precision point with double we 
            //  can use formate option in String 
           // which takes 2 parameters one is formte specifier which 
           // shows dicimal places another double value 
    String s = String.format("%.2f", c);
    double val = Double.parseDouble(s);
    System.out.println(" val is :" + val);
    // now out put will be : val is :1.67
}
vxbzzdmp

vxbzzdmp18#

你正面临双重类型的精度限制。
数学有一些任意精度的算术工具。

y4ekin9u

y4ekin9u19#

如果您只想将值作为分数进行处理,那么可以创建一个包含分子和分母字段的分数类。
写加法、减法、乘法和除法以及todouble方法。这样可以避免计算过程中出现浮动。
编辑:快速实施,

public class Fraction {

private int numerator;
private int denominator;

public Fraction(int n, int d){
    numerator = n;
    denominator = d;
}

public double toDouble(){
    return ((double)numerator)/((double)denominator);
}

public static Fraction add(Fraction a, Fraction b){
    if(a.denominator != b.denominator){
        double aTop = b.denominator * a.numerator;
        double bTop = a.denominator * b.numerator;
        return new Fraction(aTop + bTop, a.denominator * b.denominator);
    }
    else{
        return new Fraction(a.numerator + b.numerator, a.denominator);
    }
}

public static Fraction divide(Fraction a, Fraction b){
    return new Fraction(a.numerator * b.denominator, a.denominator * b.numerator);
}

public static Fraction multiply(Fraction a, Fraction b){
    return new Fraction(a.numerator * b.numerator, a.denominator * b.denominator);
}

public static Fraction subtract(Fraction a, Fraction b){
    if(a.denominator != b.denominator){
        double aTop = b.denominator * a.numerator;
        double bTop = a.denominator * b.numerator;
        return new Fraction(aTop-bTop, a.denominator*b.denominator);
    }
    else{
        return new Fraction(a.numerator - b.numerator, a.denominator);
    }
}

}
62lalag4

62lalag420#

double是java源代码中十进制数的近似值。您看到了double(二进制编码的值)和源代码(十进制编码的)之间不匹配的结果。
java正在生成最接近的二进制近似值。可以使用java.text.decimalformat来显示外观更好的十进制值。

dluptydi

dluptydi21#

例如,当您输入一个双数时, 33.33333333333333 ,得到的值实际上是最接近的可表示双精度值,确切地说:

33.3333333333333285963817615993320941925048828125

除以100得出:

0.333333333333333285963817615993320941925048828125

它也不能表示为双精度数,所以再次四舍五入到最接近的可表示值,即:

0.3333333333333332593184650249895639717578887939453125

当您打印出这个值时,它会再次四舍五入到17位小数,给出:

0.33333333333333326
sxpgvts3

sxpgvts322#

计算机以二进制形式存储数字,实际上不能准确地表示33.333或100.0之类的数字。这是使用双打的技巧之一。在将答案展示给用户之前,您必须对其进行四舍五入。幸运的是,在大多数应用程序中,您不需要那么多小数位。

相关问题