查找.NET中的一个浮点数是否是另一个浮点数的倍数
如何确定一个浮点数是另一个浮点数的倍数 e、 g.500.4是0.001的倍数吗查找.NET中的一个浮点数是否是另一个浮点数的倍数,.net,floating-point,.net,Floating Point,如何确定一个浮点数是另一个浮点数的倍数 e、 g.500.4是0.001的倍数吗 double v = 500.4; double multipleOf = 0.001; double remainder = v % multipleOf; // 0.000999999999966846 就性能而言,我不希望将双精度转换为小数。鉴于浮点数学的不精确性,我如何测试这一点?您将确定余数是否低于您的问题的可接受容差,或者余数是否非常接近您的倍数: if (Math.Abs(remainder) &
double v = 500.4;
double multipleOf = 0.001;
double remainder = v % multipleOf;
// 0.000999999999966846
就性能而言,我不希望将双精度转换为小数。鉴于浮点数学的不精确性,我如何测试这一点?您将确定
余数是否低于您的问题的可接受容差,或者余数是否非常接近您的倍数
:
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
}
if(数学绝对值(余数)<公差)
{
//余数可以忽略不计,所以我们称之为倍数
}
else if(数学绝对值(倍数)-数学绝对值(余数)<公差)
{
//余数几乎是除数的倍数,所以我们说它是倍数
}
只有您可以确定足够小的公差值。有时用于此类检查,但可能太低。如果v
非常大,而multipleOf
非常小,我们可能会说问题是病态的,因为公差可能需要非常高,结果对于应用程序中所需的精度水平是无用的。因此,寻找条件作用和精确性可能也会引起进一步的兴趣。我想这取决于你对倍数的定义。这不是一个有意义的问题。将所有值乘以1000,这样就可以使用整数类型,如int或long。或者用epsilon来表示“足够接近”。如果你要用乘法把值转换成整数,你怎么知道一个double中有多少个小数?multipleOf*Math.Pow(10,?)我更新了我的答案,因为它缺少一个检查(它不处理负值,但我认为你可以自己轻松地添加)。以下是我所知道的关于浮点比较的最有用的一篇文章,它可以让您进一步了解这个问题: