有 Java 编程相关的问题?

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

java模拟数学的最大价值。随机的

我在模仿Java中Math类的静态random()方法,以便更好地测试依赖于生成随机数的方法。我使用的代码如下:

@Mock
public double random() {
    return 1.0 - Double.MIN_VALUE;
}

这是我试图在不相等的情况下达到尽可能接近1.0的值。(例如0.9999999999…)

然而,当我调用mockMath.random()方法时,我总是得到1.0作为值。这就好像减去Double.MIN_VALUE根本不会影响1.0

为什么1.0 - Double.MIN_VALUE的结果是1.0,我如何模拟Math.random()的最大可能值


共 (2) 个答案

  1. # 2 楼答案

    double的精度有限。与1.0 - Double.MIN_VALUE最接近的可以表示为double的数字是1.0。这就是为什么你会得到1.0

    double有1位表示符号,11位表示指数,52位表示分数。(Source

    由64位表示的双精度值是(-1)^sign+1.b51b50...b0 x 2^(e-1023)

    最接近1.0的是当所有分数位都为1且指数为e-1023==-1时。 这个值是二进制的0.1111..111(53个)

    要以十进制形式获取该值:

    double d = 0.0;
    double exp =1.0;
    for (int i=1;i<=53;i++) {
      exp=exp*2.0;
      d+=1.0/exp;
    }
    System.out.println (d);
    System.out.println ("d==1.0? " + (d==1.0));
    

    它会打印

    0.9999999999999999
    d==1.0? false
    

    如果向循环中添加另一个迭代(即^{),您将得到:

    1.0
    d==1.0? true