4

我需要在一个模糊的工作中保持粒度,所以我制作了一个作为参数接收的函数:

  • 粒度(0 和 1 之间的双精度数,不包括 0)
  • 如有必要,要转换的值(大于 0 的两倍)

并返回具有正确粒度的新值。

这是我的功能:

public static double preserveGranularity(double granul, double value){
    double integerValue= (double)(int)value;
    if(granul == 1)
        return integerValue;
    double decimal = value - integerValue;
    long factor = Math.round(decimal/granul);
    return integerValue + granul*factor;
}

例子:

  • preserveGranularity(0.25, 7.7) 应该返回 7.75
  • preserveGranularity(0.01, 0.009) 应该返回 0.01

它适用于大多数值,但不适用于所有值(例如:preserveGranularity(0.2, 0.57)=0.6000000000000001,它应该返回 0.6)

问候

PS对不起,我在这个问题上犯了任何错误,这是我的第一个问题

4

2 回答 2

4

你不能用double- 来实现这一点,因为它不够精确。
doubles 不是实数。只有有限数量的位来表示它们 - 而那里有无限数量的实数(甚至是有理数),所以这些舍入误差是可以预料的。

我认为您正在寻找BigDecimal,它可以让您根据需要控制粒度,例如使用它的round()方法。

于 2012-05-10T18:50:04.463 回答
1

浮点计算并不精确(计算机只能表示这么多数字)。这意味着在除法/乘法/舍入/减法/加法运算的某个地方,您会失去精度。

于 2012-05-10T18:50:32.917 回答