2016-06-08 89 views
4

如何查找一個浮點數是否是另一個浮點數的倍數?查找一個浮點數是否是.NET中另一個浮點數的倍數

例如500.4是0.001的倍數?

double v = 500.4; 
double multipleOf = 0.001; 

double remainder = v % multipleOf; 
// 0.000999999999966846 

對於性能,我不希望將雙打轉換爲小數。鑑於浮點數學的不精確性,我該如何測試呢?

+1

我想這將取決於您的多個定義 –

+3

這不是一個有意義的問題。把所有東西都乘以1000,這樣你就可以使用像* int *或* long *這樣的整數類型。或者使用epsilon將其稱爲「足夠接近」。 –

+0

如果您要乘以將值轉換爲整數,那麼如何找出雙精度值有多少? multipleOf * Math.Pow(10,?) –

回答

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非常小,我們可能會說這個問題有問題,因爲容差可能需要這麼高,結果對於您的應用程序所要求的精度級別來說是沒用的。因此搜索調節和精度也可能會引起更多關注。