我想返回一個不超過我設置的限制的數字。例如,我想要做的相當於:使用數學強加數字限制
if (number >= limit)
number = limit;
return number;
有沒有做什麼,我只是在短短的一行描述的等價的數學方法嗎?
我想返回一個不超過我設置的限制的數字。例如,我想要做的相當於:使用數學強加數字限制
if (number >= limit)
number = limit;
return number;
有沒有做什麼,我只是在短短的一行描述的等價的數學方法嗎?
,你可以:
return Math.min(number, limit);
或:
return number >= limit ? limit : number;
還有以下數學公式:(從here拍攝)
min(a,b) = 1/2 (a + b - |a - b|)
代碼:
return (number + limit - Math.abs(number - limit))/2;
現在Math.abs
看起來非常相似,Math.min
(所以也就不會有太大的必要使用上述而不是簡單地Math.min
),雖然你可以很容易地更換與方法提出here或here:
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
)而不是整數類型,則上述結果不一定會返回任何一個值(因爲浮點表示法的工作方式)。
這是一個很好的解決方案,但是有沒有辦法在一行上做到這一點?沒關係,只是看到你的編輯。 – Hayden
@Hayden這兩種解決方案都在一條線上。不明白你的意思。 – assylias
非常感謝,一旦Stack Overflow允許,我會接受你的答案。 – Hayden