如何找到一个浮点数是否是另一个的倍数?
e.g。 500.4是0.001的倍数
double v = 500.4;
double multipleOf = 0.001;
double remainder = v % multipleOf;
// 0.000999999999966846
对于表现,我不希望不将双打转换为小数。鉴于浮点数学的不精确性,我该如何测试呢?
答案 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
非常小,我们可能会说问题是病态的,因为公差可能需要如此之高,结果对于您的应用程序所需的准确度水平来说是无用的。因此,搜索调节和精确度可能也会引起人们的兴趣。