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()
的最大可能值
# 1 楼答案
根据IEEE 754 double有15.95位小数
http://en.wikipedia.org/wiki/IEEE_floating_point
所以如果你尝试
double a = 1e0 - 1e-16 //or less
,你会得到一个=1e0# 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个)要以十进制形式获取该值:
它会打印
如果向循环中添加另一个迭代(即^{),您将得到: