无法评估java

时间:2015-05-20 12:54:32

标签: 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 个答案:

答案 0 :(得分:2)

这就是规范中定义数值运算的方式。

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

如果您需要精确的数值计算,则必须使用libwebkitgtk-3.0-0

答案 1 :(得分:1)

答案是正确的。您可能想要了解双精度数如何以二进制数字存储。因为它是基数2.如果我们使用类似基数3的东西,那么在正常数字中,2/3将是0.66666666 ...但是在“tridigit”中它将是0.2

答案 2 :(得分:1)

E符号让您感到困惑(有关其工作原理的解释here

-1.0000000000000005E-4

-0.00010000000000000005

以标准表示法和

-8.999999999999999E-5

-0.00008999999999999999

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

答案 3 :(得分:1)

试试这个:

    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);

对于精确的计算,例如货币计算,你应该使用BigDecimals,因为它们具有所需的精度,并且不会失去任何准确性。

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

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