JavaScript中toFixed的奇怪行为

4

比较浮点数。根据第一个代码块,5大于37.66。第二个代码块声称5小于37.66。toFixed()对它们做了什么,使得第一个代码块的反应如此之大?(这只在ubuntu中的chrome上进行过测试)

amount = 5
total = 37.66
check = null
if(parseFloat(amount).toFixed(2) >= parseFloat(total).toFixed(2)){
    check = "amount IS GREATER"
}

检查 >> "amount IS GREATER"

amount = 5
total = 37.66
check = null
if(parseFloat(amount.toFixed(2)) >= parseFloat(total.toFixed(2))){
    check = "amount IS GREATER"
}

检查 >> 空

2个回答

6

number.toFixed()会返回一个字符串,因此你的比较不是数字比较。

以下代码应该可以解决问题:

amount = 5;
total = 37.66;
check = null;
if(parseFloat(amount.toFixed(2)) >= parseFloat(total.toFixed(2))){
    check = "amount IS GREATER";
}

然而,这是一种有些奇怪的实现你想要达到目标的方式。不如尝试以下方法:
amount = 5;
total = 37.66;
check = null;
if( Math.round(amount * 100) > Math.round(total * 100)) {
    check = "amount IS GREATER";
}

编辑:添加了分号


所以,“5.00”大于“37.66”。这是一个字母比较吗? - Lee Quarella
是的。毕竟,'5'在'3'之后 :) - digitalbath
我为什么会认为字符串比较是按长度呢?这周过得真漫长,哈哈。 - Lee Quarella
1
这只是又一个疯狂的JavaScript类型系统让你悄悄地自己给自己惹麻烦的案例。比较运算符针对不同类型进行了重载,并且在某些情况下会发生静默类型转换,这意味着你必须非常小心地处理你正在使用的类型。 - digitalbath

0
第一个不正确,因为.toFixed将返回一个字符串,在这种情况下,一个字符串大于另一个在语境上是没有意义的。

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