Округление (настил) чисел до асимметричного разрешения - PullRequest
1 голос
/ 26 января 2012

Я создаю линейку с переменным разрешением для программы визуализации данных.Я хочу, чтобы он отображал метки тиков осей в зависимости от уровня масштабирования.

Например, при очень широком зуме он будет отображать только метки [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!

Спасибо за повторADING

Ответы [ 2 ]

1 голос
/ 26 января 2012

Если самая значимая цифра <5, используйте нули 1 и (k-1), где k - длина числа, иначе используйте нули 1 и (k-1).Следующая функция работает. </p>

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)
0 голосов
/ 26 января 2012

используйте оператор по модулю.
% во многих языках ^ означает мощность

если тик является целым числом, используйте:

newValue  =  value - value % 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...