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()的返回值不一定相同(两者均不精准)

(1000000000000000128).toString() === "1000000000000000100"
(1000000000000000128).toFixed(0) === "1000000000000000128"
(1000000000000000100).toString() === "1000000000000000100"
(1000000000000000100).toFixed(0) === "1000000000000000128"

    Number.prototype.toPrecision([precision]):DOMString,返回指定精度的是十进制字数字符串。

      注意:精度过高或过低都会引发数值的不精准。

(100.1).toPrecision(1) === "1e+2"
(100.1).toPrecision(17) === "100.09999999999999"

    Number.prototype.toExponential(fractionDigits):DOMString,返回指定精度的是十进制字数科学计数法字符串

      注意:精度过高或过低都会引发数值的不精准。

(100.1).toExponential(1) === "1.001e+2"
(100.1).toPrecision(16) === "1.0009999999999999e+2"
时间: 2025-01-29 14:18:18

JS魔法堂:再识Number type的相关文章

JS魔法堂:属性、特性,傻傻分不清楚

或许你和我一样都曾经被下面的代码所困扰 var el = document.getElementById("dummy"); el.hello = "test"; console.log(el.getAttribute("hello")); // IE67下输出test,其他浏览器输出null   "搞毛啊?",苦逼的Jser对着浏览器大呼一声.然后就用下面蹩脚的方式草草处理掉了. function getAttr(el, p

JS魔法堂:追忆那些原始的选择器

一.前言                                                                                                      首先这里说的原始选择器是指除 querySelector . querySelectorAll 外的其他选择器.从前我只使用 getElementById 获取元素并没有觉得有什么问题,但随着参与项目的前端规模逐步扩大,踩的坑就越来越多,于是将踩过的和学习过的经验教训记录在这里,供以后好

JS魔法堂:不完全国际化&amp;本地化手册 之 实战篇

前言  最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已.趁着这个机会好好学习整理一下,为后面的技术选型做准备.  本篇将于大家一起挽起袖子撸代码:) 如何获取Language tag?  在实现本地化处理前,我们起码先要获取Language tag吧?那么获取方式分为两类 1.直接获取浏览器的Language tag信息  一般来说浏览器语言的版本标示着用户所属或

JS魔法堂:jsDeferred源码剖析

一.前言    最近在研究Promises/A+规范及实现,而Promise/A+规范的制定则很大程度地参考了由日本geek cho45发 起的jsDeferred项目(<JavaScript框架设计>提供该资讯,再次感谢),追本溯源地了解jsDeferred是十分有必要的,并且当你 看过官网(http://cho45.stfuawsc.com/jsdeferred/)的新手引导后就会有种不好好学学就太可惜的感觉了,而只看 API和使用指南是无法满足我对它的好奇心的,通过解读源码读透它的设计思

JS魔法堂:那些困扰你的DOM集合类型

一.前言 大家先看看下面的js,猜猜结果会怎样吧! 可选答案: ①. 获取id属性值为id的节点元素 ②. 抛namedItem is undefined的异常 var nodes = document.getElementsByName('dummyName'); var node = nodes.namedItem('id'); 答案是两种都有可能哦!document.getElementsByName在Chrome和FF30.0中返回NodeList(木有namedItem方法的),在IE

JS魔法堂:判断节点位置关系

一.前言   在polyfill querySelectorAll 和写弹出窗时都需要判断两个节点间的位置关系,通过jQuery我们可以轻松搞定,但原生JS呢?下面我将整理各种判断方法,以供日后查阅.   二.祖孙关系 html <div id="ancestor"> <div id="parent"> <div id="son">son</div> </div> </div>

JS魔法堂:精确判断IE的文档模式by特征嗅探

一.前言   苦逼的前端攻城狮都深受浏览器兼容之苦,再完成每一项功能前都要左顾右盼,生怕浏览器不支持某个API,生怕原生API内含臭虫因此判断浏览器类型和版本号成了不可绕过的一道关卡,而特征嗅探是继浏览器探测后另一利器处理上述问题.   二.何为特征嗅探 从前我们都是通过对navigator.userAgent或navigator.appVersion两个属性值进行特定字符串匹配和萃取来区 分浏览器类型和获取版本号的.但随着IE8提供可选的文档兼容性模式设置和各种加壳浏览器的出现,导致无法通过n

JS魔法堂:LINK元素深入详解

一.前言   我们一般使用方式为 <link type="text/css" rel="stylesheet" href="text.css"> 来引入外部层叠式样式文件,但LINK元素各属性的具体含义.资源加载行为等方面却了解不多,本文打算稍微深入一下.   由于内容较多,特设目录一坨:   二.到底有没有结束标签?  三.普通属性介绍  四.属性disabled详解    1. Attribute和Property的disable

JS魔法堂:doctype我们应该了解的基础知识

一.前言 什么是doctype?其实我们一直使用,却很少停下来看清楚它到底是什么,对网页有什么作用.本篇将和大家一起探讨那个默默无闻的doctype吧!   二.什么是doctype doctype或DTD就是声明在文档首行,位于<html>前,用于告知浏览器该文档遵循那种级别的HTML或XHTML规范. 其声明格式如下: <!DOCTYPE① html②PUBLIC③ "公共标识符"④"系统标识符"⑤ [<!ELEMENT name (#P