Pyr*_*oux 4 javascript floating-point implicit-conversion node.js
我用nodeJs创建了一个程序,生成代码,如
eval("XXXXXX") == "XXXXXX"
Run Code Online (Sandbox Code Playgroud)
它运作得很好,但是在某个时刻他给了我这个:
eval("475957E-8905") == "475957E-8905"
Run Code Online (Sandbox Code Playgroud)
我用Firebug测试了它,结果是true
.但我真的不明白为什么.
当然,eval("475957E-8905")回归0
但为什么0 == "475957E-8905"呢?
这个难题有两个部分:浮点数和类型不敏感的比较使用==.
首先,475957E-8905评估为浮点数475957 * 10 ^ -8905,这个数字非常小; 在浮点方面,它0与javascript的精度限制相同.所以,eval("475957E-8905")回报0.
现在,对于第二块拼图.
这==意味着类型不必匹配,因此nodejs(像任何JavaScript引擎一样)尝试转换其中一个,以便它们可以比较它们.
从eval("475957E-8905")返回后0,它也尝试转换"475957E-8905"为整数.正如我们所见,那也是0.因此,比较是0 == 0,这是真的.
请注意,如果你做同样的事情发生eval("3") == "3"或者eval("3") == 3-在每种情况下,将字符串转换为数字和比较.
避免这个问题
您可以强制进行类型敏感的比较,如下所示:
eval("475957E-8905") === "475957E-8905"
Run Code Online (Sandbox Code Playgroud)
返回false,因为===只有当类型和值都匹配时才告诉javascript引擎返回true.