JS умное округление небольших чисел - PullRequest
4 голосов
/ 27 февраля 2020

Я ищу какой-нибудь алгоритм для "умного" округления небольших чисел. Например:
Давайте иметь массив со значениями:
0: 4.0236180709235
1: 4.02462309509067
2: 4.02412058061092
.
.
17: 4.01599998414516
18: 4.015999984116
19: 4.01949998319149

И если я посмотрю на этот массив, я могу заметить, что эти числа в основном отличаются в позиции .000, поэтому она должна вернуть -> 3 (которую я затем использую в => .toFixed (3))

Вероятно, мне следует вычислить c разницу между максимальным и минимальным значением массива и из этого получить лучшее число для десятичных разрядов.

Или l oop этого массива ...

Второй пример:
0: 4.0236180709235
1: 4.01462309509067
2: 4.03412058061092
.
.
17: 4.05599998414516
18: 4.06599998414516
19: 4.09949998319149
Там я вижу, что десятичное число для раунда должно быть 2.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 27 февраля 2020

Вы можете взять значения дельты max и min и получить количество нулей при запуске, взяв логарифм 10. Затем получите положительное округленное до целого числа в качестве значения для фиксирования числа.

function round(array) {
    var min = Math.min(...array),
        max = Math.max(...array),
        fixed = Math.ceil(-Math.log10(max - min));

    if (fixed < 0) return array;
    return array.map(v => v.toFixed(fixed));
}

console.log(...round([4.0236180709235, 4.01949998319149]));
console.log(...round([4.0236180709235, 4.09949998319149]))
console.log(...round([100, 20000]));
1 голос
/ 27 февраля 2020

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

function round(array) {
var min = Math.min(...array),
    max = Math.max(...array),
    spacing = (max - min) / (max - 1),
    fixed = Math.ceil(-Math.log10(spacing));

if (fixed < 0) return array;
return array.map(v => v.toFixed(fixed));
}

И результат выглядит хорошо.
Спасибо!

Причина, по которой я это изменил, заключалась в том, что когда у меня было больше данных, а разница между max и min была высокой, возвращалось меньшее / плохое десятичное число. С этим как будто мне нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...