【问题标题】:Rounding in Java using Math.random()在 Java 中使用 Math.random() 进行舍入
【发布时间】:2020-10-28 02:51:11
【问题描述】:

假设我写

System.out.println (Math.random()*5);

然后将获得并输出 [0, 4.9...] 中的 x。但是在将其转换为整数时,我不断看到的结果(在我的课程中)是 [0, 4]。我的问题是我们如何定义舍入函数;我熟悉 floor 函数,并且 4.9... 的 floor 正好是 5,因为不存在大于零的 epsilon 满足某个 epsilon 邻域中存在的输出 x;即,等式 4.9... = 5 就足够了,因为整数的下限是该整数,所以结果将是 5。

我哪里错了?

【问题讨论】:

  • floor(4.9); 是 4。(int)4.9; 是 4。
  • 您不是通过强制转换为整数来进行舍入。你正在截断。
  • 这是计算机浮点数学,不是数学连续浮点数学。
  • Math.random() 根本不圆。而且 4.9999 recurring 不能准确表示,最接近的表示大概已经是 5.0了。
  • 你应该能够得到的最大值是:0x13ffffffffffff * 2**-50。这个的十进制扩展有 15 9s,这对我来说似乎是一个有限的数字

标签: java math random


【解决方案1】:

编写新答案以解决 cmets 中提出的问题。 Math.random() 的输出在 [0,1) 范围内。结果将是一个严格小于 1 的数字,因此Math.random()*5 将给出范围 [0,5) 内的结果,即严格小于 5 的数字。由于转换截断,这意味着您的结果将在整数集 {0, 1, 2, 3, 4},五个值中每一个的概率(大约)相等。

Java: Math.random() Max Value (double just less than 1) 有更多关于Math.random() 可能的精确值的数学计算细节。

【讨论】:

    【解决方案2】:

    当你像这样转换为 int 时

    int i = (int) 4.9;
    

    JVM 将简单地去掉小数位,您将获得分配给变量的值 4。它不是四舍五入而是截断,

    【讨论】:

    • 4.99...重复是我的要求,而不是 4.9。
    • 4.99重复的下限是5。你可以用Wolfram alpha验证
    • @user143 在我知道的所有计算机库中,4.99 重复的下限是 4。同样,计算机数学与理论数学不同,在 Wolfram 等系统中除外。
    • @NomadMaker 好吧,可以使用其他数字表示来设计重复小数的表示,例如几何系列。计算机代数系统可以做到这一点。但是专门回答OP的问题,Java中的double实际上是一个有理数,它是小于、等于还是大于4是明确的。
    • @user143 对 IEEE 754 的网络搜索将找到您需要的资源。 Java 和其他语言将十进制数表示为 (2^exponent) 乘以 (nnnnn) 形式的有理近似值,其中 nnnnn 是有效位,2^exponent 是比例因子。还有很多其他的表示,但是 IEEE 754 是内置在硬件中的,所以它是默认的。 Java floatdouble 是它的 32 位和 64 位版本。 Java 还有其他纯软件数字表示,例如 BigDecimal 和 BigInteger,以及其他语言的许多其他表示。
    猜你喜欢
    • 2018-05-31
    • 1970-01-01
    • 2014-10-20
    • 2020-03-05
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多