一方面,Math.random()或新的Random()。nextFloat()应返回介于0和1之间的值,但不包括1,另一方面浮点数可能不准确,该值可能会在实际值附近变化值。这是否意味着Math.random()或新的Random()。nextFloat()可能在实际中返回值<0或&gt; = 1?如果没有,为什么不会发生这种情况?
答案 0 :(得分:5)
没有。文档特别保证了可能的输出范围,并指定了实现必须等同于的算法:
public float nextFloat() {
return next(24) / ((float)(1 << 24));
}
保证在半开区间[0.0,1.0]产生结果。
虽然浮点运算本身必须围绕其结果,但/
或转换为浮点等基本操作具有特定的标准化舍入行为。在这种情况下,所涉及的每个浮点运算的结果都是完全可表示的,因此不会产生舍入误差。
答案 1 :(得分:-1)
根据IEEE754的工作原理,您是安全的,因为如果您想编码1.0,您将拥有:
exponent - mantissa
011111111 - 00000...00
随机化尾数和指数的最后7位(并且不会让它们同时为1),你将始终有一个介于0和1之间的数字。
您也不会有负数,因为您必须明确设置符号位以使其为负数。