浮点不准确会导致Math.random()或new Random().nextFloat()实际返回值<0或> = 1吗?

ggr*_*grr 1 java random floating-point floating-accuracy

一方面,Math.random()或new Random().nextFloat()应返回介于0和1之间的值,但不包括1,另一方面,浮点数可能不准确,值可能会在实际值附近变化.是否暗示Math.random()或new Random().nextFloat()可能在实际中返回值<0或> = 1?如果没有,为什么不会发生?

use*_*ica 5

不可以.文档特别保证了可能的输出范围,它指定了一个算法,该实现必须等同于:

public float nextFloat() {
  return next(24) / ((float)(1 << 24));
}
Run Code Online (Sandbox Code Playgroud)

保证在半开区间[0.0,1.0]产生结果.

虽然浮点运算本身必须对其结果进行/舍入,但基本操作(如转换为浮点)具有特定的标准化舍入行为.在这种情况下,所涉及的每个浮点运算的结果都是完全可表示的,因此不会产生舍入误差.