Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找.NET中的一个浮点数是否是另一个浮点数的倍数_.net_Floating Point - Fatal编程技术网

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

查找.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) &

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

e、 g.500.4是0.001的倍数吗

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,?)我更新了我的答案,因为它缺少一个检查(它不处理负值,但我认为你可以自己轻松地添加)。以下是我所知道的关于浮点比较的最有用的一篇文章,它可以让您进一步了解这个问题: