JS Number 储存和计算
Last Edited Time
Feb 21, 2023 08:27 AM
date
Jun 11, 2021
slug
js-number
status
Published
tags
个人笔记
JavaScript
必读系列
summary
Number 存储和计JS 所能表达的最大最小值计算方法
type
Post
Number 存储和计JS 所能表达的最大最小值计算方法
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2F6e1664a6-54f4-4dec-8dd1-868c4c0cf7ea%2F21951c25-18c7-4cd0-814d-8cdbfbd829d1%2FUntitled.png%3Fid%3D42bb360d-9f76-4887-ae8c-efee24fdf379%26table%3Dblock%26spaceId%3D6e1664a6-54f4-4dec-8dd1-868c4c0cf7ea%26expirationTimestamp%3D1720015200000%26signature%3D23WDCRKfUHAO9qYtd3pvv4dVZZdGhCQqEwlK2wmfKHY?table=block&id=42bb360d-9f76-4887-ae8c-efee24fdf379&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2F6e1664a6-54f4-4dec-8dd1-868c4c0cf7ea%2F00dca372-9671-44b3-92fb-e121609db103%2FUntitled.png%3Fid%3Df74789ae-9480-468b-84c9-493af7357b07%26table%3Dblock%26spaceId%3D6e1664a6-54f4-4dec-8dd1-868c4c0cf7ea%26expirationTimestamp%3D1720015200000%26signature%3DdF9iff6ceHNcbg68tPnutOepEjtaQkWAVL5mlIGxub4?table=block&id=f74789ae-9480-468b-84c9-493af7357b07&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Ffile.notion.so%2Ff%2Ff%2F6e1664a6-54f4-4dec-8dd1-868c4c0cf7ea%2F559c703c-f301-45c6-ab37-b66e09fa898a%2FUntitled.png%3Fid%3D945aef89-cf6a-4e20-9c5d-4e8abd3fdf3f%26table%3Dblock%26spaceId%3D6e1664a6-54f4-4dec-8dd1-868c4c0cf7ea%26expirationTimestamp%3D1720015200000%26signature%3DcdkKdbkKO_6KG_BJWWr01S1pbwzWW5Gn3GeelhZMXYY?table=block&id=945aef89-cf6a-4e20-9c5d-4e8abd3fdf3f&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fuser-gold-cdn.xitu.io%2F2017%2F4%2F17%2F6acd370179282a1f5b4dc459f750e2e3.jpg%3FimageView2%2F0%2Fw%2F1280%2Fh%2F960%2Fformat%2Fwebp%2Fignore-error%2F1?table=block&id=fb8b47a1-11cb-4422-9dde-978baeffcc3d&cache=v2)
JS 中最大的数计算方法
- 指数位应该是 11 位 1, 存储指数为 2 ^ 11 - 1 = 2047, 其中最后一位代表 Infinity, 所以实际指数为 2047 - 1023 - 1 = 1023
- 当指数位不为最小的情况下, 精度位前面是 1
- 精度位应该是 52 位 1, 最小精度为 2 ^ 52
- 所以最大数的计算应为, 2 ^ 1024 - 2 ^ 52, 因为 2 ^ 1024 已经是 Infinity 了, 所以我们需要换种计算方法, 即为 2 ^1023 - 2 ^ 52 + 2 ^ 1023
// JS最大数
Math.pow(2, 1023) - Math.pow(2, 1023 - 52) + Math.pow(2, 1023);
> 1.7976931348623157e308
// JS最小数改变符号即可
> -1.7976931348623157e308
JS 中最小正小数计算方法
- 指数位应该是 11 位 0, 存储指数为 0, 实际指数位为 0 - 1023 = -1023
- 当指数位最小的情况下, 精度位前面是 0
- 精度位应该是 51 位 0 和 1 位 1, 最小精度为 2 ^ 52
- 所以最小正小数数的计算应为, 2 ^ (-52 - 1022)
// JS最小正小数
Math.pow(2, -52 - 1022);
> 5e-324
// JS最大负小数改变符号即可
> -5e-324
JS 中的精确(安全)数字
这里我们只讨论精确整型, 而不讨论精确浮点数
最大精确(安全)整型
最大的精确的整形数字应该的指数位应该是0, 然后精度位应该是 52 位 1, 加上最前面的一位 1, 所以应为 2 ^ 53 - 1
// JS最小安全整型为 +0 和 -0
> +0
> -0
// JS最大安全整型
Math.pow(2, 53) - 1;
> 9007199254740991
为什么不讨论精确(安全)浮点数
只要是数字的有效位超过 52 位, 都不是精确数字, 在二进制转换或计算中都有可能丢失精度. (所以所有二进制循环小数都不是精确数字)