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
但它产生相同的结果或结果,小数点后的数字范围不完整。
答案 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());