如何避免在JavaScript中出现负零或零下标值

6

我曾尝试使用toString()和按位运算符|,但我希望使用精度和字符串输出。正如@trincot所述,这是由于精度值造成的,例如-0.45将导致为-0。以下是我的代码。

typeof predictedHours //number e.g. -0.45
precision = 0
value={predictedHours.toFixed(precision)}
typeof value //string e.g. "-0"

问题 - 在这一行中是否有一句话的代码可以将-0转换为0 - value={predictedHours.toFixed(precision)}


这个问题中有很多相关的评论:https://dev59.com/lWw05IYBdhLWcg3weBru - Jonas Høgh
3
可能你的问题是由 -0.001.toFixed(2) === "-0" 触发的? - trincot
@trincot 您说得对。正是因为这个,我有一个JSX元素来抛出该值。 - technazi
2
那么在这种情况下,您希望字符串是什么?只是“0”而不是“-0”吗? - trincot
1
你可以使用-0.001.toFixed(2).replace(/^-0$/, "0") - trincot
显示剩余2条评论
5个回答

13
我不知道有什么特别简洁的方法来做这件事,但总是有办法的:
predictedHours.toFixed(0).replace('-0', '0')

或者,一般来说:
predictedHours.toFixed(precision).replace(/^-([.0]*)$/, '$1')

您说的没错,谢谢。 - technazi
只需将数字加上 + 0。 - undefined
@PrestonSoftware:这个问题没有必要这样做。如果你最终要将字符串解析为数字,(-0).toFixed(…)已经省略了符号。 - undefined

1
是最高效和最快的方法。 -0+0 是正零。 0+0 是正零。 负数保持负数,正数保持正数。 如果负零没有用处,那么这只是消除了负零的问题。

1

你也可以这样做:value = +predictedHours.toFixed(precision) || 0,因为-0 || 0等于0


这里不能使用“-0 || 0”,因为toFixed返回一个字符串,而“-0” !== 0。 - parentNode
你说得对,我修正了我的答案。加上一个 + 将其转换为数字 :) - Saurye

1

使用Math.abs()函数将-0替换为绝对值0。


0

我认为@trincot的建议更好,这样可以避免任何小数转换为正数,例如-0.48.toFixed(2)。花了我一些时间才理解正则表达式。不过需要注意的是:由于运算符优先级,当括号中包含负数时,使用toFixed仍然保持负数。这里有一些例子:

-0.001.toFixed(2).replace(/^-0$/, "0")
//0 '0'

console.log((-0.48).toFixed(0).replace(/^-0$/, '0')); Correct
//-0 '0'

console.log((-0.48).toFixed(2).replace(/^-0$/, '0')); Correct
//-0.48 '-0.48'

console.log(-0.48.toFixed(0).replace(/^-0$/, '0'));
//0 '0'

console.log(-0.48.toFixed(2).replace(/^-0$/, '0'));
//-0.48 '-0.48'

还可以看一下这里的例子 - toFixed()


1
不确定您所说的“真实小数”是什么意思,但可以尝试使用(-0.0048).toFixed(2) - Ry-
是的,说得好。有没有办法通过在正则表达式中添加任何可选字符来避免这种情况? - technazi
console.log((-0.0048).toFixed(2).replace(/^-0.?0?/, '0')); 会返回 00。 - technazi
我的意思是...我会使用.replace('-0', '0'), 就像这样。toFixed没有本地化,也不会产生科学计数法,所以非常安全。 - Ry-

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接