有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在java中计算十进制值时遇到问题

double  x = 0.00090; 
double b = 0.00100;
double c = x - b;

产生

-1.0000000000000005E-4

而不是

-0.0001

double  x = -0.09;       
double b = 0.001;
double c = x * b;

产生

-8.999999999999999E-5

而不是

-0.00009

我也试过了

Math.round(c) and Math.round(c*100.0)/100.0

但它产生相同的结果或小数点后数字范围不完整的结果


共 (4) 个答案

  1. # 1 楼答案

    这就是规范中定义数字操作的方式

    十进制数在内部表示为最接近的近似值,在某些情况下不是精确的文字值

    如果需要精确的数值计算,则必须使用BigDecimal

  2. # 2 楼答案

    E符号让你感到困惑(解释它是如何工作的here

    -1.0000000000000005E-4
    

    是吗

    -0.00010000000000000005
    

    用标准符号和

    -8.999999999999999E-5
    

    是吗

    -0.00008999999999999999
    

    用标准符号。你看到的所有答案都是正确的(几乎,但它们非常接近,十进制数学isn't always precise),只是使用了E符号

  3. # 3 楼答案

    答案是正确的。你可能想了解一下双精度数字是如何存储在二进制数字中的。因为它是2号基地。如果我们使用基数3,那么在正常数字中,2/3将是0.6666。。。但在“三位数”中是0.2

  4. # 4 楼答案

    试试这个:

        double  x = 0.00090; 
        double b = 0.00100;
    
        BigDecimal xd = new BigDecimal(x).setScale(10, RoundingMode.HALF_UP);
        BigDecimal bd = new BigDecimal(b).setScale(10, RoundingMode.HALF_UP);
        BigDecimal cd = xd.multiply(bd);
        double c = cd.doubleValue();
    
        System.out.println(c);
    

    对于精确的计算,比如货币计算,你应该使用大小数,因为它们具有所需的精度,并且不会失去任何精度

    如果您更喜欢不带“E”的打印,请尝试以下行:

        System.out.println(cd.toPlainString());