我正在做一些钱计算,我得到了数字-0。此数字-0不存在,因为0没有符号。为什么会这样?我知道原价在我的bd上有更多的数字。但无论如何,这种行为的事情很奇怪。
所以我正在使用这个数学表达式:我选择项目价格并减去折扣,然后我将其四舍五入。
(19.99923-20).toFixed(2)
我得到“-0.00”!这显示起来很难看。我尝试使用Number()
将其设为“实数”,但
Number((19.99923-20).toFixed(1))
将显示为“-0”。
javascript有什么问题,没有数字-0,应该只是“0”?
答案 0 :(得分:0)
使用Math.round()
或toFixed()
,JavaScript使用接近0的浮动底片进行签名,两者都可以获得-0。解决了应用快速修复,其中包括检查我们的数字是否在0到-0.005之间进入该范围(舍入到-0.01以后)。考虑2个浮动数字,因为你的例子与金钱一起工作,所以我认为1美分相关的差异:
var num=19.99923-20;
if(num>-0.005 && num<0){
num=0; //we set to '0' all -0
}else{
num=num*100;
num=Math.round(num);
num=num/100;
/*or
num=num.toFixed(2);
but this way we convert number to string*/
}
希望它有所帮助。
答案 1 :(得分:0)
toFixed
将数字转换为字符串,而不是数字。所以你看到的-0.00
是一个字符串。它是转换的结果
19.99923-20 // which is about
-0.0007699999999992713 // in internal representation
到使用toFixed method in ECMAscript standards的字符串,它将结果初始化为“ - ”表示负数,并继续转换正在转换的数字的绝对(正)值。
将字符串“ - 0.00”转换回parseFloat("-0.00")
或Number("-0.00")
的数字会返回正零数字表示(javscript使用IEEE 754标准存储数字双精度浮点表示,其确实具有负零值,但这不是问题。)
看看如何修复作品表明唯一的问题是“-0.00”结果,可以使用字符串比较来检查:
var number = 19.99923-20;
var str = number.toFixed(2);
if( str == "-0.00")
str = "0.00";
或者,您可以考虑使用永远不会返回带负号的零字符串的转换例程,例如:
function convertFixed( number, digits) {
if(isNaN(number))
return "NaN";
var neg = number < 0;
if( neg)
number = -number;
var string = number.toFixed(digits);
if( neg && Number(string) === 0) // negative zero result
neg = false;
return neg ? "-" + string : string;
}