【发布时间】: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。这个的十进制扩展有 159s,这对我来说似乎是一个有限的数字