2014-04-01 18 views
2

我想返回一個不超過我設置的限制的數字。例如,我想要做的相當於:使用數學強加數字限制

if (number >= limit) 
    number = limit; 
return number; 

有沒有做什麼,我只是在短短的一行描述的等價的數學方法嗎?

回答

6

,你可以:

return Math.min(number, limit); 

或:

return number >= limit ? limit : number; 
+0

這是一個很好的解決方案,但是有沒有辦法在一行上做到這一點?沒關係,只是看到你的編輯。 – Hayden

+1

@Hayden這兩種解決方案都在一條線上。不明白你的意思。 – assylias

+0

非常感謝,一旦Stack Overflow允許,我會接受你的答案。 – Hayden

2

還有以下數學公式:(從here拍攝)

min(a,b) = 1/2 (a + b - |a - b|) 

代碼:

return (number + limit - Math.abs(number - limit))/2; 

現在Math.abs看起來非常相似,Math.min(所以也就不會有太大的必要使用上述而不是簡單地Math.min),雖然你可以很容易地更換與方法提出herehere

mask = n >> 31   // 11111111 for negative and 00000000 for positive 
abs = (mask + n)^mask // convert negative to positive in 2's complement 
         // while not changing positive 

注:

如果number + limit可以溢出,這將無法正常工作。這可以更改爲
number - Math.abs(...) + limit以避免這種情況,但然後number - Math.abs(...)仍然可以下溢 - 您只需要牢記溢出並選擇基於數字範圍防止溢出/下溢的選項,或選擇非 - 算術選項。另外請記住,假設沒有溢出/下溢,如果您正在處理浮點值(float/double)而不是整數類型,則上述結果不一定會返回任何一個值(因爲浮點表示法的工作方式)。