JS--JavaScript数值计算与类型转换详解

探讨JavaScript数值运算中的浮点数溢出问题,解析IEEE754标准下0.1+0.2≠0.3的原理,介绍通过指定精度避免小数运算误差的方法,尤其适用于货币计算。
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”NaNfalseError
null“null”0falseError
非空字符串不转换字符串对应的数字或NaNtrueString
空字符串不转换0falseString
0“0”不转换falseNumber
NaN“NaN”不转换falseNumber
Infinity“Infinity”不转换trueNumber
Number.POSITIVE_INFINITY“Infinity"不转换trueNumber
Number.NEGATIVE_INFINITY“-Infinity”不转换trueNumber
Number.MAX_VALUE“1.7976931348623157e” + 308不转换trueNumber
Number.MIN_VALUE”5e-324"不转换trueNumber
其它所有数字”数字的字符串值“不转换trueNumber
true“true”1不转换Boolean
false”false"0不转换Boolean
对象toString()valueOf()或toString()或NaNtrue不转换

如果把非空对象用在逻辑运算环境中,则对象被转换为true。此时的对象包括所有类型的对象,即使是值为false的包装对象也转换为true。

如果把对象用在数值运算环境中,则对象会被自动转换为数字,如果转换失败,则返回值NaN。被转换为数值0.如果数组仅包含一个数字元素,则被转换为该数字的数值。如果数组包含多个元素,或者仅包含一个非数字元素,则返回NaN。

当对象用于字符串环境中时,JavaScript能够调用toString()方法把对象转换为字符串再进行相关计算。当对象与数值进行加号运算时,则会尝试将对象转换为数值,然后参与求和运算。如果不饿能够将对象转换为有效数值,则执行字符串连接操作。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值