JavaScript数值计算
JavaScript在执行数值运算时,常会出现浮点数溢出问题。
例如:0.1 + 0.2 不等于 0.3
num = 0.1 + 0.2;//0.300000000000000004
这是JavaScript中最常报告的Bug,并且这是遵循二进制浮点数算数标准(IEEE 754)而导致的结果。这个标准适合很多应用,但它违背了数字基本常识。
幸运的是,浮点数中的整数运算是精准的,所以小数表现出来的问题可以通过指定精度来避免。
num = (1 + 2) / 10;//0.3
这种处理经常在货币计算中用到,在计算货币时当然期望得到精确的结果。例如,元可以通过乘以100而全部转成分,然后就可以准确地将每项相加,求和后的结果可以除以100转换回元。
JavaScript能够自动转换变量的数据类型,这种转换是一种隐性行为。在自动转换数据类型时,JavaScript一般遵循:如果某个类型的值被用于需要其它类型的值的环境中,JavaScript就自动将这个值转换成需要的类型,具体如下表:
| 值(value) | 字符串操作环境 | 数字运算环境 | 逻辑运算环境 | 对象操作环境 |
|---|---|---|---|---|
| undefined | “undefined” | NaN | false | Error |
| null | “null” | 0 | false | Error |
| 非空字符串 | 不转换 | 字符串对应的数字或NaN | true | String |
| 空字符串 | 不转换 | 0 | false | String |
| 0 | “0” | 不转换 | false | Number |
| NaN | “NaN” | 不转换 | false | Number |
| Infinity | “Infinity” | 不转换 | true | Number |
| Number.POSITIVE_INFINITY | “Infinity" | 不转换 | true | Number |
| Number.NEGATIVE_INFINITY | “-Infinity” | 不转换 | true | Number |
| Number.MAX_VALUE | “1.7976931348623157e” + 308 | 不转换 | true | Number |
| Number.MIN_VALUE | ”5e-324" | 不转换 | true | Number |
| 其它所有数字 | ”数字的字符串值“ | 不转换 | true | Number |
| true | “true” | 1 | 不转换 | Boolean |
| false | ”false" | 0 | 不转换 | Boolean |
| 对象 | toString() | valueOf()或toString()或NaN | true | 不转换 |
如果把非空对象用在逻辑运算环境中,则对象被转换为true。此时的对象包括所有类型的对象,即使是值为false的包装对象也转换为true。
如果把对象用在数值运算环境中,则对象会被自动转换为数字,如果转换失败,则返回值NaN。被转换为数值0.如果数组仅包含一个数字元素,则被转换为该数字的数值。如果数组包含多个元素,或者仅包含一个非数字元素,则返回NaN。
当对象用于字符串环境中时,JavaScript能够调用toString()方法把对象转换为字符串再进行相关计算。当对象与数值进行加号运算时,则会尝试将对象转换为数值,然后参与求和运算。如果不饿能够将对象转换为有效数值,则执行字符串连接操作。
探讨JavaScript数值运算中的浮点数溢出问题,解析IEEE754标准下0.1+0.2≠0.3的原理,介绍通过指定精度避免小数运算误差的方法,尤其适用于货币计算。
1756

被折叠的 条评论
为什么被折叠?



