2013-08-22 2 views
1

В настоящее время я строю диаграмму реального времени. Данные, которые протекают через WebSockets, в основном состоят из простых пар timestamp/value и получаются в линейной диаграмме, основанной на времени. Теперь я столкнулся с проблемой и задаюсь вопросом, какой был бы самый стабильный и элегантный способ:Как рассчитать полезную верхнюю и нижнюю границы для двойного значения?

Y-масштабирование диаграммы должно быть динамическим, поэтому я должен постоянно следить за минимальными/максимальными значениями видимого данные. Эта часть проста, так как вам просто нужно получить значения min/max из массива данных и установить их как нижние и верхние пределы диаграмм.

Теперь я хотел добавить некоторые дополнения к этим предельным значениям, чтобы получить хорошие и круглые предельные значения. Например, если максимальное значение в данном диапазоне составляет, скажем, 24.7, я хочу, чтобы верхний предел был 30. Мне нужна функция с одним параметром, который выводит следующее верхнее «приятное» значение. Вот несколько примеров:

 0.13 -->  1 
    97.2 --> 100 
    17.08 -->  20 
    768  --> 800 
    -3.4 -->  0 
116843  --> 200000 
    0.003 -->  0.01 

Есть ли математическая функция, которую я могу использовать? Мне определенно нужно что-то стабильное, но я не вижу никакого способа добиться этого, не начав подсчитывать цифры и разбирать первую цифру и т. Д., Что было бы очень уродливо.

Спасибо за вашу помощь заранее!

С уважением, Роб

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

+0

Нет, нет стандартной математической функции для этого. За 116 843, что составляет 200 000 «лучше», чем 120 000? – Barmar

+0

Ну, это вопрос вкуса! ;-) В принципе, на естественном языке, для значений выше 0, он должен всегда увеличивать значение первой цифры на единицу и устанавливать остальную часть цифр на 0. Но я хочу сделать это без беспорядка с .toString() и т. Д. – Robert

+0

Я думаю, что числовые алгоритмы также будут беспорядочными, так как вам нужно будет использовать логарифмы base-10, чтобы найти наиболее значимую цифру, а затем вы столкнетесь с приближениями с плавающей точкой. – Barmar

ответ

1

Вы можете взять этот (должны работать для вашей цели):

function ext_ceil(val){ 
    if(val < 0) 
     return 0; 

    var str = val + ''; 
    var arr = str.split('.'); 
    var digitsLength = arr[0].length; 

    var divisor = 1; 
    if(val > 10){ 

     for(var i=0;i<(digitsLength-1);i++){ 
      divisor *= 10; 
      console.log(divisor); 
     } 
     val = val/divisor; 
     console.log(val); 
    } 

    val = Math.ceil(val); 
    val *= divisor; 
    return val; 
}; 

если вы хотите попробовать это использовать такой алгоритм my jsFiddle

+0

Спасибо за ваш ответ. Ваша функция в настоящее время работает для значений> = 1, но я увижу, могу ли я расширить ее для поддержки таких случаев, как 0,04 -> 0,1 и отрицательные значения. – Robert

+0

да, вы правы. виноват. но это может быть легко исправлено с помощью другого 'if statement' для значений ниже 0,1, вам нужно найти мультипликатор и умножить -> ceil -> divide. Для отрицательных значений вы указали в своих примерах, что -3.4 должно быть 0. Я понял, что отрицательные значения должны приводить к 0. – Martin

+0

К сожалению, я не был точным: отрицательные значения должны вести себя одинаково, так что: -17.72 -> -10 и -0,34 -> -0,3. Но я смогу запустить и запустить этот код на основе вашего кода. Я скоро отправлю решение. Тем временем я очень рад, если некоторые математические трещины придумают дополнительную магию :-) – Robert

Смежные вопросы