Как посчитать количество знаков ДО запятой?

119
13 мая 2021, 18:50

Не нашел ни одного удобного решения. Я представляю, что нужно делить на 10, 100, 1000, … , но надеюсь, что есть уже стандартная функция, которая позволит вернуть число знаков до запятой.

Вы такую знаете?)

Answer 1

Да, есть, эта функция - десятичный логарифм с округлением в меньшую сторону.

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

В случае с десятичным логарифмом(логарифмом по основанию 10) - то, в какую степень нужно возвести 10, чтобы получить аргумент.

UPD: после комментария господина @Akina и добавления ограничений ответ чуть усложнился:

let count = n => { 
  n = 1 + Math.log10(n*n) / 2; 
  return Math.max(n - n % 1, 1); 
}; 
console.log(count(10230.4)); // 5 
console.log(count(-0.0000004)); // 1  
console.log(count(-1.4)); // 1 
console.log(count(NaN)); // NaN 
 
console.log("---");  
 
let numberCount = n => 1 + Math.max(Math.floor(Math.log10(Math.abs(n))), 0); 
console.log(numberCount(1023.4)); // 4 
console.log(numberCount(-0.004)); // 1  
console.log(numberCount(-1.4)); // 1 
console.log(numberCount(NaN)); // NaN

——-

Так же можно работать со строкой, пожалуй этот метод будет короче всего:

let numberCount = n => Math.abs(n).toFixed().length; 
console.log(numberCount(1023.4)); // 4 
console.log(numberCount(-0.004)); // 1 
console.log(numberCount(1.4)); // 1 
console.log(numberCount(NaN)); // 3

——-

Рекурсивный метод:

let numberCount = (n,c) => Math.abs(n) < 1 ? (c||1) : numberCount(n/10, (c||0)+1); 
console.log(numberCount(1023.4)); // 4 
console.log(numberCount(-0.004)); // 1 
console.log(numberCount(1.4)); // 1 
console.log(numberCount(NaN)); // stack overflow

PS: и в любом случае не понятно что делать с NaN

Answer 2

    var rest = -123123.12312 
    if (isNaN(rest)){ 
      console.log("NaN") 
    }else { 
      var c = "" + rest 
      var ce = c.split('.') 
      var ress = ce[0].replace(/[^0-9]/g, '') 
      console.log(ress.length) 
    }

Примитивно))

Answer 3

Еще вариант простого решение этой задачи

function lenSymbolBeforeDot(num){
   let res = 0;
   if(isNaN(num) || !isFinite(num)){ // Проверяем, число ли
      return -1;
   }
   let getNum = String(num).match(/^-?([0-9]+)/);
   if(getNum && getNum[1]) 
      res = getNum[1].length;
   return res;
}
Answer 4
str.split(',').map(some => '${some}(${some.length})`)
READ ALSO
Как работает перебор свойств объекта?

Как работает перебор свойств объекта?

Не могу понять как работает этот код? Мы в цикле for создаём переменную cur и в условии проверяем ее наличие в объекте oНо ее там нет, условие должно...

92
JS не рисуется изображение на canvas

JS не рисуется изображение на canvas

Суть проблемы в том, что не рисуется ничего в canvasВ атрибут функции image1 передаю src и в консоли получаю "вход: (тут base64 изображения входного)",...

122
Не запускается отладка проекта CMake

Не запускается отладка проекта CMake

Возникает ошибка, при удалённой отладке:

98
Как работает аллокация памяти в контейнерах STL?

Как работает аллокация памяти в контейнерах STL?

У меня есть двухсвязный список std::list как protected обьект в классе A:

131