JS魔法堂:再识Number type
Brief
本来只打算理解JS中0.1 + 0.2 == 0.30000000000000004的原因,但发现自己对计算机的数字表示和运算十分陌生,于是只好恶补一下。以下是恶补后的成果:
基础野:细说原码、反码和补码(http://www.cnblogs.com/fsjohnhuang/p/5060242.html)
基础野:细说无符号整数(http://www.cnblogs.com/fsjohnhuang/p/5078290.html)
基础野:细说有符号整数(http://www.cnblogs.com/fsjohnhuang/p/5082829.html)
基础野:细说浮点数(http://www.cnblogs.com/fsjohnhuang/p/5109766.html)
理解JS Number type背后的IEEE 754 64位双精度数值编码后,0.1 + 0.2 == 0.30000000000000004就不言而喻了,但单纯的理解了现象的本质是不够,我们需要的是如何解决这类问题,不然下次遇到同类问题我们只能同样的无力而已:(
但在寻求或自己手写工具库前,我觉得还是先了解JS为我们提供的原生API比较明智。
APIs
Numeric literal
ES5 APIs
OctalLiteral,八进制数值字面量,数值域以0开始且不含小数点。如:012转换为十进制数值为10 。
注意:在strict mode中OctalLiteral是非法的。
DecimalLiteral,十进制数值字面量,数值域以1-9或.或0.开始。
还有含指数和不含指数两种字面量形式
含指数形式:1.1e2表示110
e或E表示指数提示符,后面紧跟则指数值Exp;
Exp必须为正/负整数或零;
基数固定为10 。
HexLiteral,十六进制数值字面量,数值域以0x或0X开始。如:0x0F转换为十进制数值为15 。
ES6 APIs
BinaryLiteral, 二进制数值字面量,数值域以0b或0B开始。如:0b0100转换为十进制数值为4 。
OctalLiteral,八进制数值字面量,数值域以0o或0O开始。如:0o12转换为十进制数值为10 。
Number Function
当以Number([value])的方式调用时,返回值为Number value。
Number Constructor
当以new Number([value])的方式调用时,返回值为Number object。
Function Properties
ES5 APIs
Number.MIN_VALUE,可表示的最接近0的值。(2^53-1)*2^-1074 即约等于1.7976931348623157 × 10^308。
Number.MAX_VALUE,可表示的最大值。 (2^53-1)*2^971即约等于5 × 10^−324。
Number.NaN,返回Number type的Not-a-Number值。
Number.NEGATIVE_INFINITY,返回-Infinity。
Number.POSITIVE_INFINITY,返回Infinity。
window.isFinite([value]),判断value值是否为有限数。会先将value转换为Number value后再判断。
window.isNaN([value]),判断value值是否为Not-a-Number。会先将value转换为Number value后再判断。
window.parseInt([value], [radix=10]),以radix作为进制将value转换为十进制整数。
window.parseFloat([value]),将value转换为实数。
ES6 APIs
Number.MIN_SAFE_INTEGER,可精确表示的整数范围下限。-Math.pow(2, 53)+1,即是-9007199254740991。
Number.MAX_SAFE_INTEGER,可精确表示的整数范围上限。Math.pow(2, 53)-1,即是9007199254740991。
Number.EPSILON,极小值(2.220446049250313e-16),作为允许的误差范围使用。
(当某运算结果的误差小于Number.EPSILON则认为该结果是可被接受的)
判断是否可接受的函数:
function withinErrorMargin (left, right) {
return Math.abs(left - right) < Number.EPSILON
}
Number.isFinite([value]),判断value值是否为有限数。若value不为Number type则直接返回false。
Number.isNaN([value]),判断value值是否为Not-a-Number。若value不为Number type则直接返回false。
Number.parseInt([value], [radix=10]),以radix作为进制将value转换为十进制整数。
Number.parseFloat([value]),将value转换为实数。
Number.isInteger([value]),value为number类型,且小数部分全为0则返回true。(Number.isInteger(2.0)返回true)
Number.isSaveInteger([value]),value为number类型,且Number.MIN_SAFE_INTEGER <= value <= Number.MAX_SAFE_INTEGER则返回true。
Number.prototype Properties
ES5 APIs
Number.prototype.toString([radix=10]):DOMString,返回以radix作为进制输出数值字符串,radix为2~36。
注意:对于负数而言,当radix为2时返回的是不补码编码的位模式,而是形如 -10100.0101011 的 "负号" + "原码位模式" 的形式。
Number.prototype.valueOf():Number value,返回Number object的[[PrimitiveValue]]值。
Number.prototype.toFixed([fractionDigits=0]):DOMString,返回指定小数位的十进制定点数字符串。
注意:1.fractionDigits必须大于等于0和小于等于20,否则会抛RangeError;
2.若数值大于e21则直接返回Number.prototype.toString()的值;
3.若数值小于e21,则通过公式计算,所以和toString()的返回值不一定相同(两者均不精准)
().toString() === ""
().toFixed() === ""
().toString() === ""
().toFixed() === ""
Number.prototype.toPrecision([precision]):DOMString,返回指定精度的是十进制字数字符串。
注意:精度过高或过低都会引发数值的不精准。
(100.1).toPrecision() === "1e+2"
(100.1).toPrecision() === "100.09999999999999"
Number.prototype.toExponential(fractionDigits):DOMString,返回指定精度的是十进制字数科学计数法字符串
注意:精度过高或过低都会引发数值的不精准。
(100.1).toExponential() === "1.001e+2"
(100.1).toPrecision() === "1.0009999999999999e+2"
Consolusion
尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/5130876.html 肥子John^_^
Thanks
http://es6.ruanyifeng.com/#docs/number
http://es5.github.io/#x15.7.4.5
JS魔法堂:再识Number type的更多相关文章
- JS魔法堂:不完全国际化&本地化手册 之 实战篇
前言 最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...
- JS魔法堂:jsDeferred源码剖析
一.前言 最近在研究Promises/A+规范及实现,而Promise/A+规范的制定则很大程度地参考了由日本geek cho45发起的jsDeferred项目(<JavaScript框架设计& ...
- JS魔法堂:属性、特性,傻傻分不清楚
一.前言 或许你和我一样都曾经被下面的代码所困扰 var el = document.getElementById('dummy'); el.hello = "test"; con ...
- JS魔法堂:追忆那些原始的选择器
一.前言 ...
- JS魔法堂:那些困扰你的DOM集合类型
一.前言 大家先看看下面的js,猜猜结果会怎样吧! 可选答案: ①. 获取id属性值为id的节点元素 ②. 抛namedItem is undefined的异常 var nodes = documen ...
- JS魔法堂:判断节点位置关系
一.前言 在polyfill querySelectorAll 和写弹出窗时都需要判断两个节点间的位置关系,通过jQuery我们可以轻松搞定,但原生JS呢?下面我将整理各种判断方法,以供日后查阅. 二 ...
- JS魔法堂:LINK元素深入详解
一.前言 我们一般使用方式为 <link type="text/css" rel="stylesheet" href="text.css&quo ...
- JS魔法堂:doctype我们应该了解的基础知识
一.前言 什么是doctype?其实我们一直使用,却很少停下来看清楚它到底是什么,对网页有什么作用.本篇将和大家一起探讨那个默默无闻的doctype吧! 二.什么是doctype doctype或DT ...
- JS魔法堂:浏览器模式和文档模式怎么玩?
一.前言 从IE8开始引入了文档兼容模式的概念,作为开发人员的我们可以在开发人员工具中通过“浏览器模式”和“文档模式”(IE11开始改为“浏览器模式”改成更贴切的“用户代理字符串”)品味一番,它的出现 ...
随机推荐
- 小谈 - web模仿手机打电话与正则表达式
昨天遇到了一个很棘手的问题,就是手机端调用web端的页面,如果用编辑器插入的内容页面中有电话的的数据就要变一下格式,让手机端可以实现拨号的功能. 研究了半天就是没一点头绪,但是偶尔看到数据中每一个电话 ...
- dijit样式定制之TextBox(一)
参考资料:http://dojotoolkit.org/reference-guide/1.9/dijit/themes.html http://archive.dojotoolkit.org/nig ...
- Linux 对比两个文本的交集和差集(comm)
200 ? "200px" : this.width)!important;} --> 介绍 comm命令可以对两个已排序好的文本的内容进行交集和差集的对比,记住必须是已排序 ...
- Unity3D音乐音效研究-MIDI与波表
其实音乐音效这个命题本身没什么好研究的. Unity3D提供了丰富的结构和使用方式,足够使用了. 但是我有一些小小的想法和需求,一般的Unity资料并没有给我答案. 一个是容量要小.MP3.OGG的高 ...
- 在cocos2dx和unity3d之间选择
人生最纠结的事,莫过于有选择………… cocos2dx和unity3d从某种意义上讲,都很不错.但当面对特定需求以及团队情况的时候,总是能分出高下的. 假设,目标游戏是一款类似 刀塔传奇 的游戏 我们 ...
- ASP.NET MVC 随想录——探索ASP.NET Identity 身份验证和基于角色的授权,中级篇
在前一篇文章中,我介绍了ASP.NET Identity 基本API的运用并创建了若干用户账号.那么在本篇文章中,我将继续ASP.NET Identity 之旅,向您展示如何运用ASP.NET Ide ...
- Repeater绑定数组并显示其值
web开发中,尤其是对于数据展示,不得不说Repeater是一个万能的控件,而且使用也很方便. 在ASP.NET中将数组绑定到Repeater中请问如何在Repeater前台页面中显示该数组的值? s ...
- fir.im Weekly - 从 iOS 10 SDK 新特性说起
从 iOS 7 翻天覆地的全新设计,iOS 8 中 Size Classes 的出现,应用扩展,以及 Cloud Kit 的加入,iOS 9 的分屏多任务特性,今年的 WWDC iOS 10 SDK ...
- Mybatis中SqlMapper配置的扩展与应用(1)
奋斗了好几个晚上调试程序,写了好几篇博客,终于建立起了Mybatis配置的扩展机制.虽然扩展机制是重要的,然而如果没有真正实用的扩展功能,那也至少是不那么鼓舞人心的,这篇博客就来举几个扩展的例子. 这 ...
- 使用Spring的Validator接口进行校验
你可以使用Spring提供的validator接口进行对象的校验.Validator接口与Errors协同工作,在Spring做校验的时候,它会将所有的校验错误汇总到Errors对象中去. 来看这个简 ...