2012-09-04 50 views
0

似乎很簡單,但無法找到一種優雅的方式......我想檢查一個值是否在一定範圍內,但也是使用有效的增量/分辨率。假設我的範圍是0.1至99.9,分辨率爲.1。有效值爲1.1和1.2,但1.15無效。我將如何檢查?C#使用有效增量檢查值的範圍

+0

什麼是您的價值?十進制?浮動? –

+0

類型在這種情況下是雙重 – user1646235

回答

0

可以使用%操作:

float i = 1.15; 
Console.WriteLine((decimal)i % .1M == 0); 

輸出:false

float i = 1.1; 
Console.WriteLine((decimal)i % .1M == 0); 

輸出:true

+0

嘿嘿,偉大的思想...... –

+0

如果有多個小數?這通常不起作用。 – Tudor

+0

@tudor - 仍然正常工作。試用1.20000,1.2345 –

0

嘗試是這樣的(0.1分辨率):

(x * 10) % 1 == 0 
+0

感謝您的幫助! – user1646235

0

請嘗試:

 double a = 0.1; 
     double b = 99.9; 
     double x = 1.5; 
     double range = 0.5; 
     double epsilon = 0.000001; 

     bool isRange = (x >= a) && (x <= b) && (Math.Abs((x - a)%range) < epsilon); 

這裏小量是一些非常小的 '錯誤' 值

0

你正在處理arithmetic progression。在你的例子a[1] = 0.1,d = 0.1,a[999] = 99.9。如果您的號碼x是發展的n個成員那麼下列成立:

n = (x - a[1])/d + 1 

所以,你必須檢查

(x - a[1])/d 

是否是一個非負整數。例如:

(1.1 - 0.1)/0.1 = 10 

因此1.1是進展的一員。但是:

(1.15 - 0.1)/0.1 = 10.5 

因此1.15不是進展的一員。

+0

在這裏學到了新東西,優秀的回答:) – user1646235

0

嘗試使用此代碼

decimal yourDecimal = ; 

if(yourDecimal % .1M == 0) 
{ 
    ...... 
} 
0

考慮使用Math.Round迫使它到你想要的精確度。你的應用程序中1.999和1.2之間有什麼區別? (另請參閱this SO question