代码之家  ›  专栏  ›  技术社区  ›  Nick M

以不同的方式将ruby中的数字向上或向下舍入到最接近的10/100/1000

  •  -1
  • Nick M  · 技术社区  · 8 年前

    想象一下销售人员和客户之间的以下对话:

    SP:我可以以50美元的价格卖给你。ST:好的,我可以接受。

    如果售货员说100美元,小计时器就会说他买不起。显然他不能免费赠送,因为销售人员不是慈善机构。

    然后又是一个普通人:

    知道吗…120美元?标普:不,200美元是我们的最低售价。AG:好的。

    然后大爸爸进来了:

    售货员:先生,您今天想花多少钱?大爸爸: 大约1200美元?为什么不付1500美元呢?大爸爸:是啊,1500美元吧。为什么不1650美元?大爸爸:我们不妨花2000美元。谢谢你的生意,先生!

    是的,我们知道谁是谁,比如说客户可能有多少钱,例如对于一个大个子来说,我们知道他身上大约有2000-5000美元。

    因此,我正在寻找一种方法,以一种聪明但敏感的方式来调整产品价格,如下所示:

    15 -> 50 #!
    23 -> 50
    51 -> 100
    71 -> 100
    109 -> 100
    132 -> 150 
    124 -> 150 #!
    173 -> 200
    399 -> 400
    549 -> 500
    1231 -> 1500 #!
    2761 -> 3000 
    3104 -> 3000
    3249 -> 3500 #!
    

    class Price
    
        def initialize(s = 0) # possibly add customer “size”?
            @price = s
        end
    
        # operations
        def inc_to(x)
            @price = [@price, x].flatten.max
            self
        end
    
        def dec_to(x)
            @price = [@price, x].flatten.min
            self
        end
    
        def inc_with(x)
            @price+=x
            self
        end
    
        def dec_by(x)
            @price = @price - x
            self
        end
    
        def avg(x)
            arr = [@price, x]
            @price = arr.inject{ |sum, el| sum + el }.to_f / arr.size
            self
        end
    
        def round
            #@price = ?
            self
        end
    
        # getters
        def value
            @price
        end
    
        def to_i
            @price.to_i
        end
    
        def to_f
            @price.to_f
        end
    
    end
    

    我试过写这个示例类,但似乎不能拉一个很好的.round方法,将感谢任何输入。

    Price.new(15).inc_to(1000).dec_to(700).avg(100).inc_to(200).inc_to(400).dec_to(351).inc_with(48).value # .round.to_i
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   Aleksei Matiushkin    8 年前

    使用通用舍入方法不可能按您所希望的方式处理输入,因为存在相互矛盾的规则(您希望是51) 四舍五入 到100人,其他人被打倒。)

    我会去做一个杂烩或者 Range Price 对:

    rounds = {
      (0..50) => 50,
      (51..110) => 100,
      (111..165) => 150,
      (166..220) => 200,
      ...
      (700..1200) => 1000,
      (1201..1600) => 1500,
      ...
      (4200..7000) => 5000      
    }
    

    然后就这么做 detect :

    rounds.detect { |range, _| range === price }.last