在.NET中查找一个浮点数是否是另一个浮点数的倍数

时间:2016-06-08 10:11:13

标签: .net floating-point

如何找到一个浮点数是否是另一个的倍数?

e.g。 500.4是0.001的倍数

double v = 500.4;
double multipleOf = 0.001;

double remainder = v % multipleOf;
// 0.000999999999966846

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

1 个答案:

答案 0 :(得分: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非常小,我们可能会说问题是病态的,因为公差可能需要如此之高,结果对于您的应用程序所需的准确度水平来说是无用的。因此,搜索调节和精确度可能也会引起人们的兴趣。