javascript 浮动动态精度?
javascript float dynamic precision?
如何获得浮点数的动态精度?
举例说明我需要什么:
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
方法?
您可以用至少一个零和一个一替换所有结尾。然后取数值。
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
)
虽然您的要求有点可疑,但一种方法是截取小数部分,然后将其与原始数据进行比较。如果它有一些阈值百分比不同,则将其视为答案。
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
part = 1.941 // part / v > 阈值,返回
然后可以配置阈值。 .9999
表示与原值99.99%
相同
希望对你有所帮助,
var number1 = 0.00019400000001
console.log(parseFloat(number1.toString().replace(/0+[1-9]$/, '')));
如何获得浮点数的动态精度?
举例说明我需要什么:
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
方法?
您可以用至少一个零和一个一替换所有结尾。然后取数值。
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
)
虽然您的要求有点可疑,但一种方法是截取小数部分,然后将其与原始数据进行比较。如果它有一些阈值百分比不同,则将其视为答案。
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 part = 1.941 // part / v > 阈值,返回
然后可以配置阈值。 .9999
表示与原值99.99%
相同
希望对你有所帮助,
var number1 = 0.00019400000001
console.log(parseFloat(number1.toString().replace(/0+[1-9]$/, '')));