我需要在模糊作业中保持粒度,所以我制作了一个接收参数的函数:
并返回一个具有正确粒度的新值。
这是我的功能:
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.2, 0.57)=0.6000000000000001,它应该返回 0.6)
问候
附言抱歉我在这个问题中犯的任何错误,这是我在这里的第一个错误
最佳答案
您无法使用 double
实现这一点 - 因为它不够精确。double
不是实数。只有有限数量的位来表示它们 - 而有无限数量的实数(甚至有理数),因此这些舍入误差是意料之中的。
我认为您正在寻找 BigDecimal
,它可以让您根据需要控制粒度,例如使用其 round()
方法。
关于保留粒度的Java函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10540341/