You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于小数概率的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:40:27