将(地板)数字舍入到不对称分辨率

时间:2012-01-26 16:43:10

标签: algorithm math language-agnostic rounding

我正在为数据可视化程序构建可变分辨率标尺控件。我希望它根据缩放级别显示轴刻度标签。

例如,使用非常宽的缩放,它将仅绘制[100,200,300]刻度标签。然后,如果我关闭缩放,它会显示[10,15,20,25]标签。

数字总是5或10的倍数。因此,部分“舍入网格”将是[1,5,10,50,100,500,1000,5000],但这对于双方都会无限增长(包括十进制数字。

问题是:给定一个任意正浮点数,我怎样才能将它“置”为网格中第一个较小的数字?

(这样我就可以根据绘图仪的缩放级别/比例设置刻度标签的粒度。)

请注意:

  • 网格是“无限的”(这就是为什么我没有使用排序和其他列表方法);
  • 浮点数没有固定的值集,除非它始终为正且非零。

  • (编辑)分辨率不对称,嘀嗒间隔是[1,5,10,50,100,500,...],增量乘数交替为2和5!

感谢您阅读

2 个答案:

答案 0 :(得分:1)

如果最高有效数字<5,则使用1和(k-1)个零,其中k是数字的长度,否则使用1和(k-1)个零。以下功能有效。

import numpy as np
def truncate(x):
    length = 0
    if x>=1:
        while x>=10:
            length+=1
            x/=10
    else:
        while x<1:
            length-=1
            x*=10
    r = max(0,-length) 
    if x<5:
        return round(np.power(10.0,length),r)
    else:
        return round(5*np.power(10.0,length),r)

答案 1 :(得分:0)

使用模运算符。
它是%多种语言^意味着权力

如果tick是整数,请使用:

newValue  =  value - value % tick

如果tick是浮点数(甚至是整数),请使用:

tickDecimals = decimalsOf(tick)      // pseudo function to know how much decimals tick has
newValue  =  (value * 10 ^ tickDecimals - ((value * 10 ^ tickDecimals) % (tick * 10 ^ tickDecimals))) / 10 ^ tickDecimals    // some parentheses are redundant