javascript浮动动态精度?

时间:2018-04-09 13:21:25

标签: javascript math precision floating

如何获得float的动态精度?

例如我需要的东西:

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 个答案:

答案 0 :(得分:2)

虽然你要求的是有点可疑,但一种方法是采用小数点,然后将其与原始数据进行比较。如果某个阈值百分比不同,请将其视为答案。

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,它会:

part = 1.9    part = 1.94    part = 1.941 // part / v&gt;阈值,返回

然后可以配置阈值。 .9999表示99.99%与原始值相同。

答案 1 :(得分:1)

我希望它会有所帮助,

getActivity()

答案 2 :(得分:0)

您可以在结尾处用至少一个零和一个替换所有结尾。然后取数字值。

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

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

答案 3 :(得分:0)

&#13;
&#13;
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 
)
&#13;
&#13;
&#13;