Округлить десятичную дробь до первых двух значащих цифр - PullRequest
0 голосов
/ 11 декабря 2018

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

Пример ввода: [0.0000007123123123, 0.0000000012321, 0.0125]

Ожидаемый результат: [0.00000071, 0.0000000013, 0.013]

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Вы можете использовать Number.toPrecision https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toPrecision

Я также использовал toLocaleString здесь, чтобы избежать e чисел при ведении журнала консоли.

ps.0.0125 обычно округляется до 2 значащих цифр: 0.013 ..

const inputs = [0.0000007123123123, 0.0000000012321, 0.0125];

inputs.forEach(i =>
  console.log(
    Number(i.toPrecision(2)).
      toLocaleString(undefined, {maximumFractionDigits: 20})
  )
);
  
0 голосов
/ 11 декабря 2018

Это мое решение, но я думаю, что это можно сделать проще.

const set = [0.0000007123123123, 0.0000000012321, 0.0125, 1.1005, 0.1511, 1.51231e-10, 10.1505, 1.511e3]

let roundDecimal = (value, precision = 1) => {
    let firstSignificantDigitPlace = e => parseInt(e.toExponential().split('-')[1]) || Math.min(precision, 1)
    if (Array.isArray(value)) {
        return set.map(e => {
            if (typeof e !== 'number') throw "roundDecimal: Array should contains only digits."
            return e.toFixed(firstSignificantDigitPlace(e) + precision )
        })
    } else if (typeof value === 'number') {
        return value.toFixed(firstSignificantDigitPlace(value) + precision )
    }
    throw "roundDecimal: Function accepts only array or digit as value."
}

console.log(roundDecimal(.0051101))
console.log(roundDecimal(set))
console.log(roundDecimal(set, 3))
console.log(roundDecimal(5.153123e-15))
console.log(roundDecimal(Number.NaN))
...