2016-06-08 93 views
4

如何查找一个浮点数是否是另一个浮点数的倍数?查找一个浮点数是否是.NET中另一个浮点数的倍数

例如500.4是0.001的倍数?

double v = 500.4; 
double multipleOf = 0.001; 

double remainder = v % multipleOf; 
// 0.000999999999966846 

对于性能,我不希望将双打转换为小数。鉴于浮点数学的不精确性,我该如何测试呢?

+1

我想这将取决于您的多个定义 –

+3

这不是一个有意义的问题。把所有东西都乘以1000,这样你就可以使用像* int *或* long *这样的整数类型。或者使用epsilon将其称为“足够接近”。 –

+0

如果您要乘以将值转换为整数,那么如何找出双精度值有多少? multipleOf * Math.Pow(10,?) –

回答

4

你会确定remainder低于可接受的公差,您的问题,或者如果remainder是非常接近你multipleOf

if (Math.Abs(remainder) < tolerance) 
{ 
    //remainder is negligible so we'll say it's a multiple 
} 
else if (Math.Abs(multipleOf) - Math.Abs(remainder) < tolerance) 
{ 
    //remainder is almost multiple of divisor so we'll say it's a multiple 
} 

只有你可以容忍一个足够小的值决定。有时machine epsilon用于这种类型的检查,但可能太低。如果v非常大,并且multipleOf非常小,我们可能会说这个问题有问题,因为容差可能需要这么高,结果对于您的应用程序所要求的精度级别来说是没用的。因此搜索调节和精度也可能会引起更多关注。