zoukankan      html  css  js  c++  java
  • 数据类型 数字类型


    数据类型 数字类型
    数字(number)有两种类型:
    JavaScript 中的常规数字以 64 位的格式 IEEE-754 存储,也被称为“双精度浮点数”。
    BigInt 数字,用于表示任意长度的整数。有时会需要它们,因为常规数字不能超过 253 或小于 -253。

    编写数字的更多方法
    想象一下,我们需要写 10 亿。显然的方法是:

    let billion = 1000000000;
    我们通常会将 10 亿写成 "1bn",或将 73 亿写成 "7.3bn"。

    在 JavaScript 中,我们通过在数字后附加字母 “e”,并指定零的数量来缩短数字:

    let billion = 1e9; // 10 亿,字面意思:数字 1 后面跟 9 个 0

    alert( 7.3e9 ); // 73 亿(7,300,000,000)

    十六进制,二进制和八进制数字
    十六进制 数字在 JavaScript 中被广泛用于表示颜色,编码字符以及其他许多东西。所以自然地,有一种较短的写方法:0x,然后是数字。

    例如:

    alert( 0xff ); // 255
    alert( 0xFF ); // 255(一样,大小写没影响)

    二进制和八进制数字系统很少使用,但也支持使用 0b 和 0o 前缀:

    let a = 0b11111111; // 二进制形式的 255
    let b = 0o377; // 八进制形式的 255

    alert( a == b ); // true,两边是相同的数字,都是 255
    只有这三种进制支持这种写法。对于其他进制,我们应该使用函数 parseInt(我们将在本章后面看到)。

    toString(base)
    方法 num.toString(base) 返回在给定 base 进制数字系统中 num 的字符串表示形式。

    举个例子:

    let num = 255;

    alert( num.toString(16) ); // ff
    alert( num.toString(2) ); // 11111111
    base 的范围可以从 2 到 36。默认情况下是 10。

    常见的用例如下:

    base=16 用于十六进制颜色,字符编码等,数字可以是 0..9 或 A..F。

    base=2 主要用于调试按位操作,数字可以是 0 或 1。

    base=36 是最大进制,数字可以是 0..9 或 A..Z。所有拉丁字母都被用于了表示数字。

    对于 36 进制来说,一个有趣且有用的例子是,当我们需要将一个较长的数字标识符转换成较短的时候,例如做一个短的 URL。可以简单地使用基数为 36 的数字系统表示:

    alert( 123456..toString(36) ); // 2n9c

    使用两个点来调用一个方法
    请注意 123456..toString(36) 中的两个点不是打错了。如果我们想直接在一个数字上调用一个方法,比如上面例子中的 toString,那么我们需要在它后面放置两个点 ..。

    舍入
    舍入(rounding)是使用数字时最常用的操作之一。

    这里有几个对数字进行舍入的内建函数:

    Math.floor
    向下舍入:3.1 变成 3,-1.1 变成 -2。
    Math.ceil
    向上舍入:3.1 变成 4,-1.1 变成 -1。
    Math.round
    向最近的整数舍入:3.1 变成 3,3.6 变成 4,-1.1 变成 -1。
    Math.trunc(IE 浏览器不支持这个方法)
    移除小数点后的所有内容而没有舍入:3.1 变成 3,-1.1 变成 -1。
    这个是总结它们之间差异的表格:

    Math.floor Math.ceil Math.round Math.trunc
    3.1 3 4 3 3
    3.6 3 4 4 3
    -1.1 -2 -1 -1 -1
    -1.6 -2 -1 -2 -1
    这些函数涵盖了处理数字小数部分的所有可能方法。但是,如果我们想将数字舍入到小数点后 n 位,该怎么办?

    例如,我们有 1.2345,并且想把它舍入到小数点后两位,仅得到 1.23。

    有两种方式可以实现这个需求:

    乘除法

    例如,要将数字舍入到小数点后两位,我们可以将数字乘以 100(或更大的 10 的整数次幂),调用舍入函数,然后再将其除回。

    let num = 1.23456;

    alert( Math.floor(num * 100) / 100 ); // 1.23456 -> 123.456 -> 123 -> 1.23
    函数 toFixed(n) 将数字舍入到小数点后 n 位,并以字符串形式返回结果。

    let num = 12.34;
    alert( num.toFixed(1) ); // "12.3"
    这会向上或向下舍入到最接近的值,类似于 Math.round:

    let num = 12.36;
    alert( num.toFixed(1) ); // "12.4"
    请注意 toFixed 的结果是一个字符串。如果小数部分比所需要的短,则在结尾添加零:

    let num = 12.34;
    alert( num.toFixed(5) ); // "12.34000",在结尾添加了 0,以达到小数点后五位
    我们可以使用一元加号或 Number() 调用,将其转换为数字:+ num.toFixed(5)。

    不精确的计算
    考虑下这个(falsy!)测试:

    alert( 0.1 + 0.2 == 0.3 ); // false

    我们能解决这个问题吗?当然,最可靠的方法是借助方法 toFixed(n) 对结果进行舍入:

    let sum = 0.1 + 0.2;
    alert( sum.toFixed(2) ); // 0.30

    请注意,toFixed 总是返回一个字符串。它确保小数点后有 2 位数字。如果我们有一个电子购物网站,并需要显示 ¥ 0.30,这实际上很方便。对于其他情况,我们可以使用一元加号将其强制转换为一个数字:

    let sum = 0.1 + 0.2;
    alert( +sum.toFixed(2) ); // 0.3

    测试:isFinite 和 isNaN

    isNaN() 函数用于检查其参数是否是非数字值。

    如果参数值为 NaN 或字符串、对象、undefined等非数字值则返回 true, 否则返回 false。

    alert( isNaN(NaN) ); // true
    alert( isNaN("str") ); // true

    isFinite(value) 将其参数转换为数字,如果是常规数字,则返回 true,而不是 NaN/Infinity/-Infinity:

    alert( isFinite("15") ); // true
    alert( isFinite("str") ); // false,因为是一个特殊的值:NaN
    alert( isFinite(Infinity) ); // false,因为是一个特殊的值:Infinity

    请注意,在所有数字函数中,包括 isFinite,空字符串或仅有空格的字符串均被视为 0。


    与 Object.is 进行比较
    有一个特殊的内建方法 Object.is,它类似于 === 一样对值进行比较,但它对于两种边缘情况更可靠:

    它适用于 NaN:Object.is(NaN,NaN) === true,这是件好事。
    值 0 和 -0 是不同的:Object.is(0,-0) === false,从技术上讲这是对的,因为在内部,数字的符号位可能会不同,即使其他所有位均为零。
    在所有其他情况下,Object.is(a,b) 与 a === b 相同。

    这种比较方式经常被用在 JavaScript 规范中。当内部算法需要比较两个值是否完全相同时,它使用 Object.is(内部称为 SameValue)。

    parseInt 和 parseFloat
    使用加号 + 或 Number() 的数字转换是严格的。如果一个值不完全是一个数字,就会失败:

    alert( +"100px" ); // NaN

    唯一的例外是字符串开头或结尾的空格,因为它们会被忽略。
    但在现实生活中,我们经常会有带有单位的值,例如 CSS 中的 "100px" 或 "12pt"。并且,在很多国家,货币符号是紧随金额之后的,所以我们有 "19€",并希望从中提取出一个数值。

    这就是 parseInt 和 parseFloat 的作用。

    它们可以从字符串中“读取”数字,直到无法读取为止。如果发生 error,则返回收集到的数字。函数 parseInt 返回一个整数,而 parseFloat 返回一个浮点数:

    alert( parseInt('100px') ); // 100
    alert( parseFloat('12.5em') ); // 12.5

    alert( parseInt('12.3') ); // 12,只有整数部分被返回了
    alert( parseFloat('12.3.4') ); // 12.3,在第二个点出停止了读取
    某些情况下,parseInt/parseFloat 会返回 NaN。当没有数字可读时会发生这种情况:

    alert( parseInt('a123') ); // NaN,第一个符号停止了读取

    parseInt(str, radix)` 的第二个参数
    parseInt() 函数具有可选的第二个参数。它指定了数字系统的基数,因此 parseInt 还可以解析十六进制数字、二进制数字等的字符串:

    alert( parseInt('0xff', 16) ); // 255
    alert( parseInt('ff', 16) ); // 255,没有 0x 仍然有效

    alert( parseInt('2n9c', 36) ); // 123456

    其他数学函数
    JavaScript 有一个内建的 Math 对象,它包含了一个小型的数学函数和常量库。

    几个例子:

    Math.random()
    返回一个从 0 到 1 的随机数(不包括 1)

    alert( Math.random() ); // 0.1234567894322
    alert( Math.random() ); // 0.5435252343232
    alert( Math.random() ); // ... (任何随机数)
    Math.max(a, b, c...) / Math.min(a, b, c...)
    从任意数量的参数中返回最大/最小值。

    alert( Math.max(3, 5, -10, 0, 1) ); // 5
    alert( Math.min(1, 2) ); // 1
    Math.pow(n, power)
    返回 n 的给定(power)次幂

    alert( Math.pow(2, 10) ); // 2 的 10 次幂 = 1024
    Math 对象中还有更多函数和常量,包括三角函数,你可以在 Math 对象文档 中找到这些内容。

    总结
    要写有很多零的数字:

    将 "e" 和 0 的数量附加到数字后。就像:123e6 与 123 后面接 6 个 0 相同。
    "e" 后面的负数将使数字除以 1 后面接着给定数量的零的数字。例如 123e-6 表示 0.000123(123 的百万分之一)。
    对于不同的数字系统:

    可以直接在十六进制(0x),八进制(0o)和二进制(0b)系统中写入数字。
    parseInt(str,base) 将字符串 str 解析为在给定的 base 数字系统中的整数,2 ≤ base ≤ 36。
    num.toString(base) 将数字转换为在给定的 base 数字系统中的字符串。
    要将 12pt 和 100px 之类的值转换为数字:

    使用 parseInt/parseFloat 进行“软”转换,它从字符串中读取数字,然后返回在发生 error 前可以读取到的值。
    小数:

    使用 Math.floor,Math.ceil,Math.trunc,Math.round 或 num.toFixed(precision) 进行舍入。
    请确保记住使用小数时会损失精度。

  • 相关阅读:
    怎样跟老板提加薪,来看看自己值多少钱
    leetcode-204-Count Primes
    Atitit. 异常的使用总结最佳实践java .net php Vo8f
    设计模式——第一课
    linux svn命令具体解释
    BTrace介绍和生产环境样例
    5.3.5 namedtuple() 创建命名字段的元组结构
    linux驱动开发之九鼎板载蜂鸣器驱动测试【转】
    hrtimer高精度定时器的简单使用【学习笔记】
    Linux时间子系统之(一):时间的基本概念【转】
  • 原文地址:https://www.cnblogs.com/perfectdata/p/15471880.html
Copyright © 2011-2022 走看看