JavaScript плавать динамическая точность?

Как я могу получить динамическую точность для поплавка?

пример того что мне нужно:

0.00019400000001.dynamicPrecision() //0.000194
0.0001940001.dynamicPrecision()     //0.000194
0.0001941.dynamicPrecision()        //0.0001941
0.0194.dynamicPrecision()           //0.0194
0.01940000.dynamicPrecision()       //0.0194 

(важно, чтобы в конце не было бесполезного нуля)

Я не могу использовать toFixed или toPrecision, потому что значимое число может измениться и неизвестно. так какой способ написать это dynamicPrecision метод с динамической точностью?

4 ответа

Решение

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

const f = (v, threshold = .9999) => {
  let shift = 1;
  let part;
  
  do {
    shift *= 10;
    part = Math.floor(v * shift) / shift;
  } while (part / v < threshold);
  
  return part;
}

[0.194, 0.194000001, 0.19401, 0.194101]
  .forEach(v => console.log(f(v)));

При этом используется фактическая математика для определения значащей цифры.

По сути, для каждого шага требуется еще одна цифра и она сравнивается со значением. Если он находится в пределах порога, он будет возвращен.

За 1.9410001 было бы:

часть = 1,9 часть = 1,94 часть = 1,941 // часть / v > порог, возвращено

Порог затем настраивается. .9999 значит это 99.99% такой же, как исходное значение.

Надеюсь, это поможет,

var number1 = 0.00019400000001
console.log(parseFloat(number1.toString().replace(/0+[1-9]$/, '')));

Вы можете заменить все окончания как минимум одним нулем и одним концом. Затем возьмите числовое значение.

function precision(v) {
    return +v.toString().replace(/0+1$/, '');
}

console.log([0.00019400000001, 0.0001940001, 0.0001941, 0.0194, 0.01940000].map(precision));

Number.prototype.dynamicPrecision = function(){
  return parseFloat(this.valueOf().toString().replace(/0+1$/, ''));
}

console.log(
  0.00019400000001.dynamicPrecision(), //0.000194
  0.0001940001.dynamicPrecision(),     //0.000194
  0.0001941.dynamicPrecision(),        //0.0001941
  0.0194.dynamicPrecision(),           //0.0194
  0.01940000.dynamicPrecision()       //0.0194 
)

Другие вопросы по тегам