当前位置: 首页 > 面试题库 >

乘法时能否将0.99999999999舍入为1.0?

乜嘉悦
2023-03-14
问题内容

当将非常接近1的浮点数乘以int> 0时,它是否可以解释为1。

也就是说,如果Math.random()返回其最高可能结果(比1.0低1步),则

(int)(Math.random() * 8)

是8还是7?

举一个实际的例子,这个经常使用的结构能否给出超出范围的索引错误:

someArray[(int)(Math.random() * someArray.length)];

我对Java和ActionScript 3的答案特别感兴趣,但是我想它们都对浮点算术使用相同的规则,并且对于任何平台的答案都将很有用。

更新 :尽管我已经接受了一个答案,但是我仍然很高兴确认在ActionScript
3中也不会出错,因为一位同事报告说他一次看到它出错了,这在一定程度上促使了我提出这个问题。


问题答案:

如果将1.0以下的最大值乘以someInt(> 0),结果将永远不会是someInt

可以对整数进行彻底测试,如下所示:

Double greatestLessThanOne = Double.longBitsToDouble(4607182418800017407L);

// Assert that greatestLessThanOne is indeed the largest double less than 1.
//assert 1.0 == greatestLessThanOne + Math.ulp(greatestLessThanOne);

for (int i = 1; i >= 0; i++)
    if ((int) (greatestLessThanOne * i) == i)
        System.out.println("Exception found: " + i);

代码段不产生任何输出。

Math.ulp返回给定double和double值之间的距离,此距离随后在幅度上更大。因此,该断言确保greatestLessThanOne确实是小于1.0的最大值。)

换句话说,你的线

Object element = elementArray[(int)(Math.random() * elementArray.length)];

永远不会引发ArrayIndexOutOfBoundsException。

此外,根据Mark Dickinsons在此处的评论,当乘以double时也是如此。

通过采用舍入至最接近模式的IEEE 754浮点运算,可以显示x * y <y x < 1.0以及任何非微小正数y。(如果y它是次普通数或最小的正普通数,则可能会失败。)



 类似资料:
  • 检查了一些解决方案,但我没有得到预期的结果,这是我的代码; 谢了!

  • 问题内容: 给出50的结果。这是为什么?它是如何计算的? (对不起,我被这个问题的较早版本误认为值是46) 问题答案: SQL ROUND()函数将数字四舍五入到精度… 例如: round(45.65,1)给出结果= 45.7 round(45.65,-1)给出结果= 50 因为这种情况下的精度是从小数点开始计算的。如果为正数,则将考虑右侧数字,如果> = 5,则将其向上舍入;如果<= 4,则四舍

  • 我有一个Java BigDecimal表达式,如下所示: 哪里 BigDecimal totalCase = BigDecimal。零;BigDecimal totalPrep = BigDecimal。零; 我必须将totalPrep除以totalCase,结果乘以100,得到以%表示的结果值。66.6666666666666666666666666666666666667 假设总准备是二进制2

  • swift中取整1.005的问题 1.005四舍五入到小数点后两位,结果是1.0,而不是1.01,如何求解? 输出:

  • 问题内容: 如何将值转换为执行以下操作: 也就是说,答案总是四舍五入。 问题答案: 如果你明确地 投 来,小数部分将被截去。例如: 此外,如果需要返回值,也可以使用方法舍入值。

  • 问题内容: 有没有办法将python浮点数舍入为x小数?例如: 我已经找到了修剪/截断它们的方法(66.666666666-> 66.6666),但是不是圆形的(66.666666666-> 66.6667)。 问题答案: 使用内置功能: 帮助: round(number [,ndigits])->浮点数 将数字四舍五入到给定的精度(以十进制数字表示)(默认为0位数)。这总是返回一个浮点数。精度可