基于小数概率的double转int函数异常:为何总是向下取整?
问题原因分析
- 判断逻辑完全错误:
random.nextDouble()返回的是0到1之间的随机数,而输入的number(比如1.75)必然大于1,因此random.nextDouble() < number永远为真,导致函数永远执行Math.floor(number)的向下取整分支。 - 拼写错误:
Math.celi是笔误,正确方法名是Math.ceil,这个错误会导致编译失败。 - Random对象重复创建:每次调用函数都新建
Random实例,短时间内多次调用可能导致随机数序列重复,影响随机性,但这不是当前“总是向下取整”的直接原因。
修正后的代码
import java.util.Random; public class NumberUtils { // 复用Random实例,避免重复创建 private static final Random RANDOM = new Random(); public static int fairIntFromDouble(final double number) { // 提取小数部分,比如1.75的小数部分是0.75,-1.75的小数部分是0.75 double fractionalPart = number - Math.floor(number); // 随机数小于小数部分时,向上取整(对应小数部分的概率) if (RANDOM.nextDouble() < fractionalPart) { return (int) Math.ceil(number); } else { return (int) Math.floor(number); } } }
验证逻辑
以输入1.75为例:
- 小数部分是0.75,
RANDOM.nextDouble()有75%的概率返回0到0.75之间的数,此时进入向上取整分支,返回2; - 剩余25%概率返回0.75到1之间的数,进入向下取整分支,返回1,完全符合需求。
对于负数,比如-1.75:
- 小数部分是0.75,75%概率向上取整得到-1,25%概率向下取整得到-2,逻辑同样自洽。
内容的提问来源于stack exchange,提问作者nexus102352
相关产品推荐
相关产品推荐

