簡體   English   中英

Ruby - 如何確定一個數字是否在給定百分比容差的范圍內?

[英]Ruby - how to find out if a number is within a range with given percentage tolerance?

假設我有這種情況間隔:

min_value = 500
max_value = 900

我想知道是否有測試號碼,例如。 max_value check_value = 1000min_value和 max_value 的 25% 以內。

在這種特殊情況下,結果將是yes ,因為1000 - 25%750 ,介於500900之間。

有這樣的 function 嗎?

有這樣的 function 嗎?

不,沒有內置的方法。 這是一個非常具體/利基的問題。

但是,定義自定義方法相當簡單。 例如,如何:

def in_range_with_tolerance?(check_value:, min_value:, max_value:, tolerance:)
  allowed_range = (min_value / (1 + tolerance) .. max_value / (1 - tolerance))
  allowed_range.include?(check_value)
end

in_range_with_tolerance?(
  check_value: 1000,
  min_value: 500,
  max_value: 900,
  tolerance: 0.25
)
  # => true

但是,您可能希望仔細考慮一下這個allowed_range是如何實際定義的......例如,上面允許的最大值是否應該是 1125,因為900 + 25% == 1125 或 1200,因為1200 - 25% == 900 用這樣的百分比寫方程是……可疑的。

在以下情況下,給定范圍 A 的兩個范圍重疊:

  • 范圍 B 從范圍 A 開始,
  • 范圍 B 在范圍 A 內結束或
  • 范圍 B 在范圍 A 之前開始並在范圍 A 之后結束

例子:

Range A    |-----|
             |-----|  Case 1
         |-----|      Case 2
             |-|      Case 1 + 2
         |---------|  Case 3

仔細觀察規則是:當范圍 B 在范圍 A 結束之前開始並且范圍 B 在范圍 A 開始之后結束時,兩個范圍重疊。

想象范圍 A 為(min_value..max_value)和范圍 B ((check_value * 0.75)..(check_value * 1.25))那么您可以將條件簡化為:

min_value <= (check_value * 1.25) && (check_value * 0.75) <= max_value

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM