数字和数学运算

购物车会累加价格,游戏会记录分数,表单会计算要收取的税款。这一切都归结为数字和对它们进行算术运算。JavaScript 将数字作为其核心构建块之一,本章介绍的是可以对它们进行的操作:日常数学、用于舍入和随机性的内置辅助函数,以及困扰几乎所有人的部分——将在页面中输入的文本转换回可以相加的数字。
数字和算术运算
JavaScript 有一个**number** 类型,它覆盖了所有内容。整数如 42 和小数如 9.99 都是同一种类型的值,所以你永远不需要在它们之间选择:
const price = 9.99;
const quantity = 3;
const total = price * quantity;
console.log(total); // 29.97你可以用已知的符号进行数学运算:+ 加法,- 减法,* 乘法,/ 除法。还有一个不太熟悉的 %,是余数运算符。它给出除法后的余数:
const remainder = 7 % 2;
console.log(remainder); // 17 除以 2 等于 3 余 1,所以 7 % 2 是 1。这是检查数字是否为偶数的方法:偶数除以 2 没有余数,所以偶数的 number % 2 是 0,奇数是 1。
number 类型,所以整数和小数是同一种东西,你永远不需要在它们之间选择。运算符是 + - * / 加上 %(余数),它是除法后剩下的。巧妙的技巧是 % 2:对偶数是 0,对奇数是 1。 Math 对象
当你需要超过基本运算符的功能时,JavaScript 给你**Math**,一个内置的数学辅助函数集合。你用点号按名称调用它们:
console.log(Math.round(4.6)); // 5
console.log(Math.floor(4.6)); // 4
console.log(Math.ceil(4.1)); // 5Math.round 四舍五入到最近的整数,Math.floor 总是向下舍入,Math.ceil 总是向上舍入。还有 Math.max 和 Math.min,它们选择你给出的数字中最大或最小的:
console.log(Math.max(3, 8, 5)); // 8
console.log(Math.min(3, 8, 5)); // 3还有 Math.random,它给出一个 0 到 1(不包括 1)之间的随机小数。单独它很少是你想要的,所以常见的做法是将其乘以一个数并向下取整来得到一个随机整数:
const roll = Math.floor(Math.random() * 6) + 1;
console.log(roll); // 4(每次都是不同的数字)Math.random() * 6 产生 0 到 6 之间的某个数,Math.floor 将其降低到 0 到 5 之间的整数,+ 1 将其转移到 1 到 6 的骰子掷出。
Math 是一个现成的数学辅助函数工具箱,你用点号调用:Math.round、Math.floor(向下)、Math.ceil(向上),以及 Math.max / Math.min 用于最大和最小值。Math.random 给出 0 到 1 之间的小数,值得记住的公式是 Math.floor(Math.random() * n) 来得到随机整数。我花了好几次尝试来相信这个模式,所以复制它并慢慢读它。 将字符串转换为数字
任何人在页面上输入的东西都以**文本**形式到达,即使看起来像数字。在框中输入 5,你得到字符串 "5",而不是数字 5。这很重要,因为两个字符串上的 + 会连接它们而不是相加:
const a = "5";
const b = "3";
console.log(a + b); // "53",不是 8要进行数学运算,你首先将文本转换为数字。最清晰的方法是 Number():
const count = Number("5");
console.log(count + 3); // 8还有两个你会看到的:parseInt 读取整数并丢弃任何小数,parseFloat 保留小数:
console.log(parseInt("42px")); // 42
console.log(parseFloat("9.99")); // 9.99这两者都可以读取坐在某些文本开头的数字,比如 "42px",这是 Number 做不到的。还有一个快捷方式,在字符串前放一个 +,它的转换方式与 Number 相同:
console.log(+"7"); // 7"5" 不是数字 5,"5" + "3" 给出 "53" 而不是 8。首先转换:Number("5") 最清晰,parseInt 读取整数,parseFloat 保留小数,字符串前的 + 是快速快捷方式。注意连接而不是相加的陷阱,它会困住每个人一次。 数字的尖锐边缘
JavaScript 中的数字包含一个值得早期看一次的惊喜。添加两个简单的小数,你可以得到一个奇怪的答案:
console.log(0.1 + 0.2); // 0.30000000000000004这不是你代码中的错误。计算机以无法准确表示每个值的方式存储小数,所以会产生微小的误差。它很少重要,当它重要时,你舍入结果以供显示:
const sum = 0.1 + 0.2;
console.log(Math.round(sum * 100) / 100); // 0.3你还会遇到一个称为 NaN 的值,简称"非数字"。当数学运算没有合理的答案时,你会得到它,比如尝试将无意义的文本转换为数字:
console.log(Number("hello")); // NaN在你的输出中看到 NaN 通常意味着某处的转换出错了,所以它是一个有用的线索,而不是要害怕的东西。
0.1 + 0.2 出来是 0.30000000000000004,这是正常的,不是你代码中的错误。当它重要时,在显示之前舍入结果。而 NaN 意味着"非数字",当转换失败时你得到的答案,所以把它当作某些文本没有按预期变成数字的线索。 数字接下来去哪里
数字是 JavaScript 中少数几个核心数据类型之一,与文本和真/假值并排。大多数真实程序混合使用它们,从字符串中提取数字、比较它、将结果存储在变量中,进行比较和组合的运算符是接下来运算符的主题。

