JavaScript系列(4)--数值类型专题

JavaScript数值类型专题 🔢

在前三篇文章中,我们探讨了JavaScript的语言特性、ECMAScript标准和引擎工作原理。今天,让我们深入了解JavaScript中的数值类型。这个看似简单的主题实际上蕴含着许多有趣的细节和需要注意的要点。

数值类型概述 🌟

💡 小知识:JavaScript中所有的数字都是以64位浮点数(IEEE 754)格式存储的,这种统一的表示方式既带来了便利,也带来了一些特殊的行为。

数值的内部表示 📊

JavaScript中的数值是如何在内存中存储的:

// 1. 数值的基本表示
function numberRepresentation() {// 整数const integer = 42;console.log(integer.toString(2));  // 二进制表示:101010// 浮点数const float = 3.14;console.log(float.toString(2));    // 二进制表示:11.001001000111...// 科学记数法const scientific = 1.23e-4;        // 0.000123console.log(scientific.toFixed(6)); // "0.000123"// 特殊值console.log(Number.MAX_VALUE);     // 1.7976931348623157e+308console.log(Number.MIN_VALUE);     // 5e-324console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991console.log(Number.MIN_SAFE_INTEGER); // -9007199254740991console.log(Number.EPSILON);       // 2.220446049250313e-16
}// 2. 数值精度问题
function precisionIssues() {// 浮点数计算精度问题console.log(0.1 + 0.2);           // 0.30000000000000004console.log(0.1 + 0.2 === 0.3);   // false// 安全的整数运算console.log(Number.isSafeInteger(9007199254740991)); // trueconsole.log(Number.isSafeInteger(9007199254740992)); // false// 处理精度问题的方法function safeAdd(a, b) {// 转换为整数计算const factor = 1000000;return (a * factor + b * factor) / factor;}console.log(safeAdd(0.1, 0.2));   // 0.3
}// 3. 数值的边界情况
function numberBoundaries() {// Infinity和-Infinityconsole.log(1 / 0);               // Infinityconsole.log(-1 / 0);              // -Infinityconsole.log(Infinity > Number.MAX_VALUE); // true// NaN(Not a Number)console.log(0 / 0);               // NaNconsole.log(parseInt('abc'));      // NaNconsole.log(NaN === NaN);         // falseconsole.log(Number.isNaN(NaN));   // true// 零的符号console.log(0 === -0);            // trueconsole.log(1 / 0);               // Infinityconsole.log(1 / -0);              // -Infinityconsole.log(Object.is(0, -0));    // false
}

数值转换和格式化 🔄

JavaScript提供了多种方式来转换和格式化数值:

// 1. 数值转换
function numberConversion() {// 字符串转数值console.log(Number('123'));        // 123console.log(parseInt('123abc'));   // 123console.log(parseFloat('3.14'));   // 3.14console.log(+'123');              // 123// 不同进制的转换console.log(parseInt('1010', 2));  // 10 (二进制转十进制)console.log(parseInt('ff', 16));   // 255 (十六进制转十进制)console.log((255).toString(16));   // "ff" (十进制转十六进制)// 数值格式化const num = 3.14159;console.log(num.toFixed(2));       // "3.14"console.log(num.toPrecision(3));   // "3.14"console.log(num.toExponential(2)); // "3.14e+0"
}// 2. 本地化格式
function numberLocalization() {const number = 1234567.89;// 使用不同的地区格式console.log(number.toLocaleString('en-US'));     // "1,234,567.89"console.log(number.toLocaleString('de-DE'));     // "1.234.567,89"console.log(number.toLocaleString('zh-CN'));     // "1,234,567.89"// 货币格式化const options = { style: 'currency', currency: 'USD' };console.log(number.toLocaleString('en-US', options)); // "$1,234,567.89"console.log(number.toLocaleString('de-DE', options)); // "1.234.567,89 $"console.log(number.toLocaleString('zh-CN', options)); // "US$1,234,567.89"
}// 3. 自定义格式化
function customFormatting() {// 添加千位分隔符function addThousandsSeparator(num) {return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');}console.log(addThousandsSeparator(1234567)); // "1,234,567"// 格式化为指定小数位数function formatDecimal(num, places) {return Number(Math.round(num + 'e' + places) + 'e-' + places);}console.log(formatDecimal(3.14159, 2)); // 3.14
}

数学运算和计算 ➗

JavaScript提供了丰富的数学运算功能:

// 1. 基本数学运算
function basicMath() {// 四则运算console.log(10 + 5);              // 15console.log(10 - 5);              // 5console.log(10 * 5);              // 50console.log(10 / 5);              // 2// 取模和幂运算console.log(10 % 3);              // 1console.log(2 ** 3);              // 8// 自增和自减let num = 5;console.log(num++);               // 5 (返回后增加)console.log(++num);               // 7 (增加后返回)
}// 2. Math对象方法
function mathObjectMethods() {// 取整方法console.log(Math.floor(3.7));     // 3console.log(Math.ceil(3.2));      // 4console.log(Math.round(3.5));     // 4console.log(Math.trunc(3.7));     // 3// 最值console.log(Math.max(1, 5, 3));   // 5console.log(Math.min(1, 5, 3));   // 1// 随机数console.log(Math.random());       // 0到1之间的随机数// 三角函数console.log(Math.sin(Math.PI / 2));// 1console.log(Math.cos(Math.PI));    // -1console.log(Math.tan(Math.PI / 4));// 1
}// 3. 高精度计算
class DecimalCalculator {constructor(precision = 10) {this.precision = precision;this.multiplier = 10 ** precision;}add(a, b) {const result = this._toInteger(a) + this._toInteger(b);return result / this.multiplier;}subtract(a, b) {const result = this._toInteger(a) - this._toInteger(b);return result / this.multiplier;}multiply(a, b) {const result = this._toInteger(a) * this._toInteger(b);return result / (this.multiplier * this.multiplier);}divide(a, b) {if (b === 0) throw new Error('除数不能为0');const result = (this._toInteger(a) * this.multiplier) / this._toInteger(b);return result;}_toInteger(num) {return Math.round(num * this.multiplier);}
}// 使用高精度计算器
const calculator = new DecimalCalculator(2);
console.log(calculator.add(0.1, 0.2));     // 0.3
console.log(calculator.multiply(0.1, 0.2)); // 0.02

数值类型的应用场景 💼

让我们看看数值类型在实际应用中的一些场景:

// 1. 金融计算
class FinancialCalculator {// 计算复利static compoundInterest(principal, rate, years) {return principal * Math.pow(1 + rate, years);}// 计算贷款每月还款额static monthlyPayment(principal, annualRate, years) {const monthlyRate = annualRate / 12;const numberOfPayments = years * 12;return principal * monthlyRate * Math.pow(1 + monthlyRate, numberOfPayments) / (Math.pow(1 + monthlyRate, numberOfPayments) - 1);}// 计算折现现值static presentValue(futureValue, rate, years) {return futureValue / Math.pow(1 + rate, years);}
}// 2. 统计计算
class StatisticsCalculator {// 计算平均值static mean(numbers) {return numbers.reduce((sum, num) => sum + num, 0) / numbers.length;}// 计算中位数static median(numbers) {const sorted = [...numbers].sort((a, b) => a - b);const middle = Math.floor(sorted.length / 2);if (sorted.length % 2 === 0) {return (sorted[middle - 1] + sorted[middle]) / 2;}return sorted[middle];}// 计算标准差static standardDeviation(numbers) {const mean = this.mean(numbers);const squareDiffs = numbers.map(num => Math.pow(num - mean, 2));return Math.sqrt(this.mean(squareDiffs));}
}// 3. 图形计算
class GeometryCalculator {// 计算圆的面积static circleArea(radius) {return Math.PI * radius * radius;}// 计算三角形面积static triangleArea(base, height) {return (base * height) / 2;}// 计算两点之间的距离static distance(x1, y1, x2, y2) {return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));}// 计算角度static toDegrees(radians) {return radians * (180 / Math.PI);}static toRadians(degrees) {return degrees * (Math.PI / 180);}
}

性能优化技巧 🚀

在处理数值计算时,有一些性能优化的技巧:

// 1. 位运算优化
function bitOperations() {// 使用位运算取整console.log(~~3.7);               // 3console.log(3.7 | 0);             // 3// 使用位运算判断奇偶function isEven(num) {return (num & 1) === 0;}// 使用位运算乘除2console.log(8 << 1);              // 16 (乘2)console.log(8 >> 1);              // 4 (除2)
}// 2. 缓存计算结果
class MathCache {constructor() {this.cache = new Map();}// 计算并缓存结果calculate(operation, ...args) {const key = `${operation}-${args.join(',')}`;if (!this.cache.has(key)) {const result = this._performCalculation(operation, ...args);this.cache.set(key, result);}return this.cache.get(key);}_performCalculation(operation, ...args) {switch (operation) {case 'power':return Math.pow(...args);case 'sqrt':return Math.sqrt(args[0]);// 添加更多运算...default:throw new Error('未知的运算');}}
}// 3. 批量计算优化
function batchCalculations() {// 使用TypedArray进行批量计算const numbers = new Float64Array(1000000);// 填充数据for (let i = 0; i < numbers.length; i++) {numbers[i] = Math.random();}// 批量计算平方根const results = new Float64Array(numbers.length);for (let i = 0; i < numbers.length; i++) {results[i] = Math.sqrt(numbers[i]);}
}

最佳实践建议 💡

  1. 处理精度问题
// 1. 使用整数运算
function moneyCalculation(amount1, amount2) {// 转换为分进行计算const cents1 = Math.round(amount1 * 100);const cents2 = Math.round(amount2 * 100);return (cents1 + cents2) / 100;
}// 2. 使用toFixed进行显示
function formatMoney(amount) {return Number(amount.toFixed(2));
}// 3. 比较浮点数
function approximatelyEqual(n1, n2, epsilon = 0.0001) {return Math.abs(n1 - n2) < epsilon;
}
  1. 数值验证和安全性
// 1. 验证是否为有效数字
function isValidNumber(value) {return typeof value === 'number' && !isNaN(value) && isFinite(value);
}// 2. 安全的数值转换
function safeParseInt(value, base = 10) {const result = parseInt(value, base);return isNaN(result) ? 0 : result;
}// 3. 范围限制
function clamp(num, min, max) {return Math.min(Math.max(num, min), max);
}

结语 📝

JavaScript的数值类型虽然看似简单,但要正确处理各种场景还是需要深入的理解。我们学习了:

  1. 数值的内部表示和精度问题
  2. 数值转换和格式化方法
  3. 数学运算和计算技巧
  4. 实际应用场景
  5. 性能优化和最佳实践

💡 学习建议:在处理金融计算时,务必注意精度问题,可以考虑使用专门的库(如decimal.js)来处理高精度计算。


如果你觉得这篇文章有帮助,欢迎点赞收藏,也期待在评论区看到你的想法和建议!👇

终身学习,共同成长。

咱们下一期见

💻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/501613.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DATACOM-DHCP-复习-实验

DHCP 概述工作原理DHCP分配机制 配置配置基于全局地址池的DHCP服务器配置DHCP Relay中继验证 实验配置DHCP中继 参考 概述 动态主机配置协议DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种网络管理协议&#xff0c;用于集中对用户IP地址进行动态管理和…

深入浅出 Beam Search:自然语言处理中的高效搜索利器

Beam Search 技术详解 搜索系列相关文章&#xff08;置顶&#xff09; 1.原始信息再加工&#xff1a;一文读懂倒排索引 2.慧眼识词&#xff1a;解析TF-IDF工作原理 3.超越TF-IDF&#xff1a;信息检索之BM25 4.深入浅出 Beam Search&#xff1a;自然语言处理中的高效搜索利器 1…

二、CSS基础

一、选择器(1) 大白话&#xff1a;我们人为认为的解析方式是&#xff0c;从左往右查找&#xff0c;对于浏览器来说&#xff0c;是从右往左查找&#xff0c;解析速度更高。 注&#xff1a; 伪类选择器 - 作用于实际存在的元素&#xff0c;用于描述元素的某种特定状态或关系&…

从摩托罗拉手机打印短信的简单方法

昨天我试图从摩托罗拉智能手机上打印短信&#xff0c;但当我通过USB将手机连接到电脑时&#xff0c;我在电脑上找不到它们。由于我的手机内存已达到限制&#xff0c;并且我想保留短信的纸质版本&#xff0c;您能帮我将短信从摩托罗拉手机导出到计算机吗&#xff1f; 如您所知&…

Linux终端输入删除键backspace显示^H,输入上下左右键显示^A^B^C^D原理以及详细解决办法!

当我们装完Linux系统之后,我们可能会碰到按下删除键后出现^H这种情况。 同样,输入上下左右键显示^A^B^C^D这种情况。 这是为什么呢? 别急,后面我会说具体解决办法,先来看看这是为什么? 一、终端程序架构 首先,我们需要了解终端程序架构。 终端程序架构分为三层,分别…

ESP32 I2S音频总线学习笔记(一):初识I2S通信与配置基础

文章目录 简介为什么需要I2S&#xff1f;关于音频信号采样率分辨率音频声道 怎样使用I2S传输音频&#xff1f;位时钟BCLK字时钟WS串行数据SD I2S传输模型I2S通信格式I2S格式左对齐格式右对齐格式 i2s基本配置i2s 底层API加载I2S驱动设置I2S使用的引脚I2S读取数据I2S发送数据卸载…

JAVA:利用 Redis 实现每周热评的技术指南

1、简述 在现代应用中&#xff0c;尤其是社交媒体和内容平台&#xff0c;展示热门评论是常见的功能。我们可以通过 Redis 的高性能和丰富的数据结构&#xff0c;轻松实现每周热评功能。本文将详细介绍如何利用 Redis 实现每周热评&#xff0c;并列出完整的实现代码。 2、需求分…

vscode代码AI插件Continue 安装与使用

“Continue” 是一款强大的插件&#xff0c;它主要用于在开发过程中提供智能的代码延续功能。例如&#xff0c;当你在编写代码并且需要进行下一步操作或者完成一个代码块时&#xff0c;它能够根据代码的上下文、语法规则以及相关的库和框架知识&#xff0c;为你提供可能的代码续…

kafka开机自启失败问题处理

前言&#xff1a;在当今大数据处理领域&#xff0c;Kafka 作为一款高性能、分布式的消息队列系统&#xff0c;发挥着举足轻重的作用。无论是海量数据的实时传输&#xff0c;还是复杂系统间的解耦通信&#xff0c;Kafka 都能轻松应对。然而&#xff0c;在实际部署和运维 Kafka 的…

Linux Red Hat 7.9 Server安装GitLab

1、关闭防火墙 执行 systemctl disable firewalld 查看服务器状态 systemctl status firewalld 2、禁用selinux vi /etc/selinux/config 将SELINUX 的值改为 disabled 3、安装policycoreutils-python 执行 yum install policycoreutils-python 4、下载gitlab wget --co…

PostgreSQL对称between比较运算

本文介绍PostgreSQL对称between比较功能&#xff1a;between symmetric&#xff0c;在动态拼接SQL时利用它可以简化判断。PostgreSQL 9.4 及以上版本支持BETWEEN SYMMETRIC操作符&#xff0c;MySQL、Oracle、MsSQL没有对应功能。 between 比较 PostgreSQL的between结构允许你对…

[CTF/网络安全] 攻防世界 simple_php 解题详析

题目描述&#xff1a;小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 代码解读 $a$_GET[a]; 从HTTP GET请求参数中获取一个名为a的变量&#xff0c;并将其赋值给变量a。符号用于禁止错误输出&#xff0c;如果不存在参数a则会将变量a设置为NULL。 $b$_GET[b];…

日志聚类算法 Drain 的实践与改良

在现实场景中&#xff0c;业务程序输出的日志往往规模庞大并且类型纷繁复杂。我们在查询和查看这些日志时&#xff0c;平铺的日志列表会让我们目不暇接&#xff0c;难以快速聚焦找到重要的日志条目。 在观测云中&#xff0c;我们在日志页面提供了聚类分析功能&#xff0c;可以…

RabbitMQ基础篇之Java客户端快速入门

文章目录 需求 项目设置与依赖管理 配置RabbitMQ的连接信息创建队列与消息发送创建消费者&#xff08;消息接收&#xff09;环境准备与操作 需求 利用控制台创建队列 simple.queue在 publisher 服务中&#xff0c;利用 SpringAMQP 直接向 simple.queue 发送消息在 consumer 服…

在虚幻引擎4(UE4)中使用蓝图的详细教程

在虚幻引擎4&#xff08;UE4&#xff09;中使用蓝图的详细教程 虚幻引擎4&#xff08;Unreal Engine 4&#xff0c;简称UE4&#xff09;是一款功能强大的游戏引擎&#xff0c;广泛应用于游戏开发、虚拟现实、建筑可视化等领域。UE4 提供了一个强大的可视化脚本工具——蓝图&am…

初学STM32 ---高级定时器互补输出带死区控制

互补输出&#xff0c;还带死区控制&#xff0c;什么意思&#xff1f; 带死区控制的互补输出应用之H桥 捕获/比较通道的输出部分&#xff08;通道1至3&#xff09; 死区时间计算 举个栗子&#xff08;F1为例&#xff09;&#xff1a;DTG[7:0]250&#xff0c;250即二进制&#x…

MarkDown怎么转pdf;Mark Text怎么使用;

MarkDown怎么转pdf 目录 MarkDown怎么转pdf先用CSDN进行编辑,能双向看版式;标题最后直接导出pdfMark Text怎么使用一、界面介绍二、基本操作三、视图模式四、其他功能先用CSDN进行编辑,能双向看版式; 标题最后直接导出pdf Mark Text怎么使用 Mark Text是一款简洁的开源Mar…

华为ensp-BGP路由过滤

学习新思想&#xff0c;争做新青年&#xff0c;今天学习的是BGP路由过滤 实验目的&#xff1a; 掌握利用BGP路由属性AS_Path进行路由过滤的方法 掌握利用BGP路由属性Community进行路由过滤的方法 掌握利用BGP路由属性Next_Hop进行路由过滤的方法 实验内容&#xff1a; 本实…

HackMyVM-Airbind靶机的测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、Getshell 3、提权 使用ipv6绕过iptables 四、结论 一、测试环境 1、系统环境 渗透机&#xff1a;kali2021.1(192.168.101.127) 靶 机&#xff1a;debian(192.168.101.11…

springcloud篇3-docker需熟练掌握的知识点

docker的原理请参考博文《Docker与Kubernetes》。 一、安装docker的指令 1.1 安装yum工具 yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken补充&#xff1a;配置镜像源 注意&#xff1a; yum安装是在线联网下载安装&#xff0c;而很多的资源…