代码之家  ›  专栏  ›  技术社区  ›  sheats

如何将小数舍入到最接近的分数?

  •  7
  • sheats  · 技术社区  · 17 年前

    不确定这是不是正确的提问方式,但问题出在这里。

    如果纬度为26.746346081599476,我如何才能发现数字26.75比数字16大,而26.6875比数字16小?

    26.0
    26.0625
    26.125
    26.1875
    26.25
    26.3125
    26.375
    26.4375
    26.5
    26.5625
    26.625
    26.6875
    My Number: 26.746346081599476
    26.75
    26.8125
    26.875
    26.9375
    27.0
    

    我使用的是JavaScript,所以在这方面的答案是有帮助的,但不是必需的。我可以蛮横地强迫它,但我正在寻找优雅的方式。

    更重要的是,我想为正在开发的映射应用程序创建标准图块。我们正在使用Bing地图,每次用户平移或放大时,我都会按需加载数据。最好利用服务器端缓存来处理这些请求,因此如果我对发送到服务器的查询进行标准化,我将获得一些缓存命中。如果我不标准化对服务器的请求,那么同一个用户不太可能同时查看某个确切的位置。

    因此,通过以下方式获得缓存命中的可能性更高: /路径/data.json?tl=26.6875,-80.6875&br=26.75,-80.75 比: /路径/data.json?tl=26.7494618767896,-80.10930061340332&br=26.743234270702878,-80.09607195854187

    我们也欢迎任何非开箱即用的答案。

    6 回复  |  直到 17 年前
        1
  •  14
  •   mob    17 年前

    要查找1/n的最近倍数:

    lower_bound = 1.0 / n * Math.floor(n * your_number);
    upper_bound = 1.0 / n * Math.ceil(n * your_number);
    

    如果您的号码已经是1/16的倍数,您可能需要使用一些特殊的处理方法。

    // alternate solution so that lower_bound <= your_number < upper_bound
    lower_bound = 1.0 / n * Math.floor(n * your_number);
    upper_bound = 1.0 / n * Math.floor(n * your_number + 1.0);
    
        2
  •  9
  •   Guffa    17 年前

    将该值乘以16,使用floor或ceil方法,然后除以16:

    var higher = Math.ceil(number * 16) / 16;
    var lower = Math.floor(number * 16) / 16;
    
        3
  •  2
  •   Russ Cam    17 年前
    function bounds(number, numerator, denominator) {
      var frac = denominator/numerator;
      return {
        lower: Math.floor(frac * number) / frac,
        upper: Math.ceil(frac * number) / frac,
      }
    } 
    
    
    bounds(26.746346081599476,1,16)
    // returns an object with properties
    // lower : 26.6875 
    // upper : 26.75
    
        4
  •  1
  •   Georg Schölly Crazy Developer    17 年前

    听起来像四舍五入到最近的16_

    rounded = Math.round(number * 16) / 16;
    

    您可以得到不精确的数字,因为浮点表示法,但如果您只将其用于缓存,那么这在您的情况下就不重要了。

        5
  •  0
  •   David Oneill    17 年前

    你对分割感兴趣的最小分数是什么?16是最小的增量吗?

    如果是,只需将数字乘以16即可。将其转为int并除以16以找到下限。把它转为int,加1,然后除以16得到上界。

        6
  •  0
  •   patros    17 年前

    目前还没有公布的几个策略:

    a)创建一个查找表,将小数点后的数字映射到最近的16位。只要使用你需要的任何精度(可能是百分之一)。

    b)创建一个从0到1的16位的表,然后用您的数字%1进行二进制样式的搜索。