获取JavaScript中包含其值的最低有效位
我想从JavaScript中的数字中提取包含其值的最低有效位(这样就不会丢失任何信息) 比如说获取JavaScript中包含其值的最低有效位,javascript,floating-point,numbers,Javascript,Floating Point,Numbers,我想从JavaScript中的数字中提取包含其值的最低有效位(这样就不会丢失任何信息) 比如说 12.0123323->0.0000003 123299000->9000 123001->1 123001.01->0.01 10000000->10000000 等等 有没有一个简洁的方法可以做到这一点 编辑: 正如人们注意到的,由于Javascript:s处理数字的方式,它不能表示12.0123323,所以让我们假设在这些情况下它是一个字符串 const least = num => [
12.0123323
->0.0000003
123299000
->9000
123001
->1
123001.01
->0.01
10000000
->10000000
等等
有没有一个简洁的方法可以做到这一点
编辑:
正如人们注意到的,由于Javascript:s处理数字的方式,它不能表示12.0123323,所以让我们假设在这些情况下它是一个字符串
const least = num => [...num.toString()].reduceRight((res, d, i) => (+res ? (d === "." ? "." : "0") : d) + res, "");
它基本上从右到左遍历数字的字符串表示形式(toString
)(reduceRight
),如果当前结果中已经有一个数字(+res
),则
它要么接收点,要么将任何其他数字转换为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;
}
您可以检查该值是否为整数,并选择不同的替换模式以获得正确的最低有效值
函数最小值(x){
返回x==数学楼层(x)
?+x.toString().替换(/.*(=[1-9]0*$)/,“”)
:+x.toString().replace(/\d(?=.[1-9]$)/g,'0');
}
变量数组=[
12.0123323, // 0.0000003
123299000, // 9000
123001, // 1
123001.01, // 0.01
10000000 // 10000000
];
log(array.map(最少))代码>
。作为控制台包装{max height:100%!important;top:0;}
您需要定义“最低有效位”的含义,因为例如12.0123323
没有准确表示。也许你可以通过一些合理的取整规则来做到这一点。我会测试defaulttoString
是否能完成这项工作,它可能会。您尝试了什么?这是家庭作业吗?@Cheersandhth.-Alf我明白了,嗯,但当我在控制台中打印它时,它仍然显示正确的小数数。@user1506145:Alf的意思是JavaScript中的浮点值不能正好是12.0123323。这是因为JavaScript使用二进制浮点。JavaScript中最接近的浮点值可能是12.0123323000000006288701154089119230106353759765625。但是JavaScript在默认情况下可能会显示“12.0123323”。(我不记得JavaScript默认设置输出数字的格式。)因此,您认为的12.0123323不是12.0123323,真实值的最低有效位是5。@user1506145:这意味着您必须澄清您的问题。如果您有一个数字(代表一个数字的字符串)而不是一个浮点数,您可以检查该字符串以查看最低有效位是什么。如果您有一个浮点数,那么它要么是一个整数,要么它的最低有效位是5。(转换为十进制时,所有二进制分数以5结尾。)如果您知道浮点数实际上来自位数有限的十进制数字,则可以找到原始值的最低有效位。
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(''))