我正在为数据可视化程序构建可变分辨率标尺控件。我希望它根据缩放级别显示轴刻度标签。
例如,使用非常宽的缩放,它将仅绘制[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!
感谢您阅读
答案 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