连接两个数字,创建一个由整数和小数部分组成的新数字



我有两个数字,我需要把它们转换成一个由整数部分和小数部分组成的数字。

我遇到问题了,因为表示整数部分的数字可以是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] === "-";
}

来源

最新更新