Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

理解JavaScript中的浮点数 #111

Open
originalix opened this issue Jan 20, 2019 · 0 comments
Open

理解JavaScript中的浮点数 #111

originalix opened this issue Jan 20, 2019 · 0 comments

Comments

@originalix
Copy link
Owner

如果你除了JavaScript外还有接触过其他的编程语言,那么你应该会发现在别的编程语言中,数值型的数据类型有好几种,例如Objective-C中的int,double, float,long等,而在JavaScript中就有一个特殊的点,它只有Number这一种数值型的数据类型。因为这一特殊性,Number也是ECMAScript中需要特别关注的一个数据类型了。

而一句话来概括JavaScript中的Number类型就是,这是由IEEE754格式来表示整数和浮点数值(双精度数值)。

双精度浮点数值能准确的表示高达53位精度的整数,从-2^53到2^53这个区间的所有整数都是有效的双精度浮点数,因此,尽管JavaScript中缺少明显的整数类型,但是依然可以进行整数运算。

所谓浮点数值,就是该树脂中必须包含一个小数点,并且小数点后面必须至少有一位数字。虽然个位数点前面可以没有整数,但是一般的编程过程中不推荐这种写法。

大多数的算术运算符都可以使用整数、实数或两者的组合进行计算。

0.1 * 0.19 // 0.19
-99 + 100 // 1
21-12.3; //  8.7
2.5 / 5; // 0.5
21 % 8; // 5

由于保存浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机地将浮点数值转换为整数值。显然,如果小数点后面没有跟任何数字,那么这个数值就可以作为整数值来保存。同样的,如果浮点数值本身表示的就是一个小数(1.0),那么该数值也会被转换为整数。

关于浮点数最后的警示是,我们应该时刻对它们保持警惕,浮点数看似跟其他语言的浮点数并无两样,但是它们是出了名的不精确。甚至一些看起来最简单的算术运算都会产生不正确的结果。

0.1 + 0.2; // 0.30000000000000004

这里使用的必须是这个经典的例子,也是被当做面试题问过无数遍的问题。尽管64位的精度已经相当高了,但是双精度浮点数也只能表示一组有限的数字,而不能表示所有的实数集。浮点运算只能产生近似的结果,四舍五入到最接近的可表示的实数。

关于浮点数会产生舍入误差的问题,有一点需要明确:这是使用基于IEEE754数值的浮点计算的通病,ECMAScript并非独此一家,其他使用相同数值格式的语言也存在这个问题。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant