我有两个数字,我需要把它们转换成一个由整数部分和小数部分组成的数字。
我遇到问题了,因为表示整数部分的数字可以是0或-0
我想过类似的东西,但结果仍然没有得到0号。我想用数学。符号,但如果是0或-0,则返回0。
const i = -0
const f = 20
const value = parseFloat(i.toString() + "." + f.toString())
console.log(value)
在js中这是预期的
// Positive and negative zero are equal to each other in JavaScript:
console.log(+0 === -0) // true
console.log(+0 == -0) // true
// Note that +0 is the same as 0:
console.log(+0) // 0
console.log(0 === -0) // true
console.log(0 == -0) // true
这个行为来自ECMAScript第7.2.13节
为了区分,你应该使用Object。是:(ES6 +)
console.log(+0 === -0) // true
console.log(Object.is(+0,-0)) // false
function makeN(i,f){
return (i + f / 100) * (Object.is(i,-0)?-1:1);
}
console.log(makeN(-0,20)); //-0.20
console.log(makeN(0,20)); //0.20
使用ES5或以下版本,可以使用-Infinity当1/-0产生-∞
console.log(1/-0) // -Infinity
console.log(1/-0 === -Infinity) // true
function makeN(i,f){
return (i + f / 100) * (1/i === -Infinity?-1:1);
}
console.log(makeN(-0,20)); //-0.20
console.log(makeN(0,20)); //0.20
不限于小数点后2位的解使用jsbench。例如,toString + parseFloat比下面的解决方案慢93%
function makeN(i,f){
return (i + f / (Math.pow(10,f.toString().length))) * (Object.is(i,-0)?-1:1);
}
您可能需要检查该数字是否为零负:
const i = -0
const f = 20
const sign = isZeroNegative(i) ? '-' : '';
const value = parseFloat(sign + i.toString() + "." + f.toString())
console.log(value)
function isZeroNegative(zero) {
if (zero !== 0) return false;
return zero.toLocaleString()[0] === "-";
}
来源