我想从JavaScript中的数字中提取最低有效数字,包括其值(这样就不会丢失任何信息)
例如
12.0123323
- > 0.0000003
123299000
- > 9000
123001
- > 1
123001.01
- > 0.01
10000000
- > 10000000
等等...
有一个巧妙的方法来做到这一点?
编辑:正如人们已经注意到因为Javascript:s处理数字的方式它不能代表12.0123323,所以让我们假设它是那些极端情况下的字符串。
您可以检查该值是否为整数,并选择不同的替换模式以获取正确的最低有效值。
function least(x) {
return x === Math.floor(x)
? +x.toString().replace(/.*(?=[1-9]0*$)/, '')
: +x.toString().replace(/\d(?=.*[1-9]$)/g, '0');
}
var array = [
12.0123323, // 0.0000003
123299000, // 9000
123001, // 1
123001.01, // 0.01
10000000 // 10000000
];
console.log(array.map(least));
.as-console-wrapper { max-height: 100% !important; top: 0; }
const least = num => [...num.toString()].reduceRight((res, d, i) => (+res ? (d === "." ? "." : "0") : d) + res, "");
它基本上遍历从右到左(toString
)的数字的字符串表示(reduceRight
),如果当前结果已经有一个数字(+res
)然后
d === "." ? "." : "0"
它接管点或将任何其他数字转换为0.如果还没有数字(:
),它只是添加当前的一个d
,并附加已经遍历的部分+ res
如果您更喜欢可读代码:
function least(num){
var res = "";
for(var char of num.toString().split("").reverse()){
if(+res){
res = (char === "." ? "." : "0") + res;
} else {
res = char + res;
}
}
return res;
}
var foundNonzero = false
Number("324.034"
.split('')
.reverse()
.map((i)=>{
if(i==='.') return i
if(foundNonzero) return '0'
if(i!=='0'){
foundNonzero = true
}
return i
}).reverse().join(''))