在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
但它产生相同的结果或小数点后数字范围不完整的结果
# 1 楼答案
这就是规范中定义数字操作的方式
十进制数在内部表示为最接近的近似值,在某些情况下不是精确的文字值
如果需要精确的数值计算,则必须使用
BigDecimal
# 2 楼答案
E
符号让你感到困惑(解释它是如何工作的here)是吗
用标准符号和
是吗
用标准符号。你看到的所有答案都是正确的(几乎,但它们非常接近,十进制数学isn't always precise),只是使用了
E
符号# 3 楼答案
答案是正确的。你可能想了解一下双精度数字是如何存储在二进制数字中的。因为它是2号基地。如果我们使用基数3,那么在正常数字中,2/3将是0.6666。。。但在“三位数”中是0.2
# 4 楼答案
试试这个:
对于精确的计算,比如货币计算,你应该使用大小数,因为它们具有所需的精度,并且不会失去任何精度
如果您更喜欢不带“E”的打印,请尝试以下行: