有 Java 编程相关的问题?

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

java二进制十进制减法

我想减去2double个值,我已经尝试了以下代码

double val1 = 2.0;
double val2 = 1.10;

System.out.println(val1 - val2);

我得到的结果是

0.8999999999999999

为了以0.9的形式获取输出,我使用BigDecimal进行了如下尝试:

BigDecimal val1BD = new BigDecimal(val1);
BigDecimal val2BD = new BigDecimal(val2);

System.out.println(val1BD.subtract(val2BD));

我得到的结果是

0.899999999999999911182158029987476766109466552734375

然后我试着用BigDecimal.valueOf()

val1BD = BigDecimal.valueOf(val1);
val2BD = BigDecimal.valueOf(val2);

System.out.println(val1BD.subtract(val2BD));

最后我得到的输出是0.9

我的问题是,案例2和;案例3

在案例2中,我为什么得到这样的输出


共 (2) 个答案

  1. # 1 楼答案

    ^{}使用双值的规范String表示,内部使用Double.toString(double),这就是为什么在第二种情况下使用0.9

    Note: This is generally the preferred way to convert a double (or float) into a BigDecimal, as the value returned is equal to that resulting from constructing a BigDecimal from the result of using Double.toString(double).

    使用^{}时,它将值转换为double值的精确浮点表示,而不使用String表示

    Translates a double into a BigDecimal which is the exact decimal representation of the double's binary floating-point value.

    ...

    NOTES :

    1. The results of this constructor can be somewhat unpredictable.

    ...

    例如:

    BigDecimal bd1 = new BigDecimal(Double.toString(0.9));
    BigDecimal bd2 = new BigDecimal(0.9);
    System.out.println(bd1);
    System.out.println(bd2);
    

    输出:

    0.9
    0.90000000000000002220446049250313080847263336181640625
    
  2. # 2 楼答案

    对于那些来这里寻找BigDecimal其他问题的人(与上述问题无关)。。。 记住为方法提供mathContext以避免某些问题,例如

            MathContext mc = new MathContext(10, RoundingMode.HALF_UP);
            BigDecimal hitRate = new BigDecimal(totalGetValuesHitted).divide(new BigDecimal(totalGetValuesRequested), mc);
            BigDecimal missRate = new BigDecimal(1.0, mc).subtract(hitRate, mc);