0

0

javascript数字如何运算_如何处理数学计算和精度问题【教程】

紅蓮之龍

紅蓮之龍

发布时间:2026-01-31 17:15:02

|

470人浏览过

|

来源于php中文网

原创

JavaScript数字运算基于IEEE 754双精度浮点数,导致0.1+0.2≠0.3是设计使然;十进制小数在二进制中无限循环,截断引发舍入误差;金融场景须转为整数(如分)计算,用Math.round()避免精度丢失;高精度需求推荐decimal.js或big.js,比较小数应使用容差而非===。

javascript数字如何运算_如何处理数学计算和精度问题【教程】

JavaScript 中的数字运算不是“直接算就完事”,而是默认用 IEEE 754 双精度浮点数表示,这意味着 0.1 + 0.2 !== 0.3 是常态,不是 bug —— 是设计如此。

为什么 0.1 + 0.2 得到 0.30000000000000004

因为十进制小数(如 0.1)在二进制中是无限循环小数,就像 1/3 在十进制中是 0.333… 一样。JS 的 Number 类型只能存有限位,截断后产生舍入误差。

  • 所有涉及小数的加减乘除都可能累积这类误差,不只是 +
  • parseInt("0.1")Math.floor(0.1) 不会修复精度问题,它们只是丢弃小数部分
  • toFixed() 返回字符串,且四舍五入逻辑受浏览器实现影响(比如 (0.615).toFixed(2) 在某些环境下返回 "0.61" 而非 "0.62"

金融/计费场景必须用整数运算

钱不能靠 parseFloattoFixed 拼凑。正确做法是把金额统一转为「最小单位」(如分),全程用整数计算:

const priceInYuan = 19.99;
const priceInFen = Math.round(priceInYuan * 100); // → 1999(整数)
const totalFen = priceInFen * 3; // → 5997
const totalYuan = totalFen / 100; // → 59.97(仅用于显示)
  • 务必用 Math.round(),而不是 Math.floor() 或直接乘——避免 19.99 * 100 算出 1998.9999999999998
  • 乘除法优先级高,但混合运算时仍建议加括号明确意图,例如 Math.round((a + b) * 100)
  • 不要对中间结果调用 toFixed() 再转回数字——它会再次引入字符串解析误差

需要高精度小数时用 BigInt 或第三方库

原生 JS 没有 decimal 类型。BigInt 只支持整数,不能直接处理小数;若必须保留小数位做精确计算(如科学计算、汇率换算),推荐轻量库:

Cutout.Pro抠图
Cutout.Pro抠图

AI批量抠图去背景

下载

立即学习Java免费学习笔记(深入)”;

  • decimal.js:API 类似 Number,支持指定精度、四舍五入模式,new Decimal('0.1').plus('0.2').equals('0.3') 返回 true
  • big.js:更小(~6KB),适合前端嵌入,但 API 更精简,不支持幂运算等高级操作
  • 避免用 mathjs 这类重型库——它功能全但体积大,且默认仍走浮点路径,需显式启用 BigNumber 模式

比较两个小数是否相等?别用 ===

直接用 === 判断 0.1 + 0.2 === 0.3 必然失败。稳妥做法是设定容差(epsilon):

function equal(a, b, epsilon = Number.EPSILON) {
  return Math.abs(a - b) < epsilon;
}
equal(0.1 + 0.2, 0.3); // → true
  • Number.EPSILON(≈2.22e-16)适合比较接近 0 的数;对较大数值(如 >1000),应按比例放大 epsilon,例如 Math.abs(a - b)
  • 如果是业务逻辑中的「是否足够接近」(如动画帧值判断),容差常设为 1e-61e-10 更合理
  • 注意:容差比较不能替代整数化方案——它只是让判断“看起来对”,不解决底层计算偏差

真正棘手的不是“怎么算”,而是“在哪一步开始算错”。很多人在输入阶段就用 parseFloat(input.value) 把用户输入的 "19.99" 变成 19.990000000000002,后面再怎么修都晚了。输入即整数、全程整数、输出才转小数——这条链路断掉任何一环,精度问题就会冒头。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1503

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

625

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

675

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

610

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

173

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

83

2025.08.07

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

54

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.6万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号