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

Jam*_*ing 5 .net floating-point

如何确定一个浮点数是否是另一个浮点数的倍数?

例如 500.4 是 0.001 的倍数吗?

double v = 500.4;
double multipleOf = 0.001;

double remainder = v % multipleOf;
// 0.000999999999966846
Run Code Online (Sandbox Code Playgroud)

为了性能,我不想将双精度数转换为小数。鉴于浮点数学的不精确性,我该如何测试这一点?

kei*_*ith 5

您将确定 是否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
}
Run Code Online (Sandbox Code Playgroud)

只有您可以决定一个足够小的容差值。有时机器 epsilon用于此类检查,但它可能太低。如果v非常大和multipleOf非常小,我们可能会说问题是病态的,因为容差可能需要很高,结果对于您应用程序中所需的精度水平来说是无用的。因此,寻找调节和精确度可能也会引起人们的进一步兴趣。