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

  • 粒度(0 和 1 之间的 double 值,不包括 0)
  • 要转换的值,如有必要(它是大于 0 的 double 值)

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

    这是我的功能:
    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)

    问候

    附言抱歉我在这个问题中犯的任何错误,这是我在这里的第一个错误

    最佳答案

    您无法使用 double 实现这一点 - 因为它不够精确。double 不是实数。只有有限数量的位来表示它们 - 而有无限数量的实数(甚至有理数),因此这些舍入误差是意料之中的。

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

    关于保留粒度的Java函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10540341/

    10-12 04:25