科学计算【免费下载链接】decimal.jsAn arbitrary-precision Decimal type for JavaScript项目地址https://gitcode.com/gh_mirrors/de/decimal.js点击查看免费下载decimal.js 是为 JavaScript 提供任意精度十进制运算的轻量级库仓库根目录即 README.md 所述核心它以**有效数字significant digits**而非小数位数定义精度所有计算结果都会按精度与舍入模式统一舍入行为类似 Python 的decimal模块。阅读本文后你将掌握如何加载与构造 Decimal、规避浮点精度损失、使用完整的 Number.prototype/Math 风格 API、配置 precision/rounding/modulo 等参数、通过 clone 建立多配置构造器并理解其内部存储结构与测试验证方式。一、库定位与核心特性decimal.js当前版本 10.6.0见 package.json是一个An arbitrary-precision Decimal type for JavaScript即专用于任意精度十进制数的类型系统。其核心特性包括支持整数与浮点数Integers and floats简单但功能完整的 APISimple but full-featured API大量复制 JavaScriptNumber.prototype与Math对象的方法原生支持十六进制、二进制、八进制数值的解析与输出无任何第三方依赖No dependencies仅使用 JavaScript 1.5ECMAScript 3特性平台兼容性广附带完整文档与测试集并内置 TypeScript 声明文件decimal.d.ts被 math.js 等知名库内部使用README 明确说明 Used under the hood by math.js与同作者维护的 [bignumber.js] 系仓库内未包含属外部资料不同README 明确指出本库的定位差异精度以有效数字而非小数位指定且所有计算不仅是除法都会按该精度舍入同时本库额外提供了三角函数、双曲函数并支持非整数幂因此体积比 bignumber.js 和更小的 big.js 更大。若不需要三角函数README 建议改用更轻量的 decimal.js-light 版本。二、加载方式浏览器脚本、ES Module 与 Node.jsREADME 说明库本身是单个 JavaScript 文件 decimal.js 或 ES 模块 decimal.mjs无需任何依赖即可加载。2.1 浏览器script srcpath/to/decimal.js/script script typemodule import Decimal from ./path/to/decimal.mjs; ... /script2.2 Node.jsnpm install decimal.jsconst Decimal require(decimal.js); // CommonJS import Decimal from decimal.js; // ES Module 默认导出 import {Decimal} from decimal.js; // ES Module 命名导出从 package.json 的exports字段可以印证三种入口的映射关系import指向./decimal.mjsrequire指向./decimal.jstypes指向./decimal.d.ts且main为decimal、module为decimal.mjs、browser为decimal.js符合 Node 与打包器生态的通用约定。三、构造 Decimalnumber、string、bigint 与 Decimal 实例README 说明库导出的是一个构造函数Decimal其参数可以是 number、string 或 Decimal 实例。结合 decimal.js 中构造函数的实现与 decimal.d.ts 的类型定义type Value string | number | bigint | Decimal实际上还支持 ES6 的bigint类型x new Decimal(123.4567) y new Decimal(123456.7e-3) z new Decimal(x) x.equals(y) y.equals(z) x.equals(z) // true构造时遵循以下规则来自源码实现可对照 decimal.jsnumber 类型先处理 0区分正负零、负数符号Infinity/NaN直接保留普通数值通过v.toString()交给parseDecimal解析string 类型先剥离开头的/-符号再依次用isDecimal十进制指数记法、parseOther其他进制正则匹配处理bigint 类型转成字符串后走十进制解析Decimal 实例直接复制其s符号、e指数、d数字数组并做 minE/maxE 边界截断越界分别变为 0 或 Infinity。3.1 精度损失场景为什么推荐传字符串README 特别强调当数值超过几个有效数字时推荐传字符串而非 number因为 JS 原生 number 是 IEEE 754 双精度浮点仅能精确表示约 1516 位有效数字。以下示例在 README 中完整给出// 超过 15 位有效数字的字面量导致的精度损失 new Decimal(1.0000000000000001) // 1 new Decimal(88259496234518.57) // 88259496234518.56 new Decimal(99999999999999999999) // 100000000000000000000 // 超出 Number 值域范围的字面量导致的精度损失 new Decimal(2e308) // Infinity new Decimal(1e-324) // 0 // Number 算术意外结果导致的精度损失 new Decimal(0.7 0.1) // 0.7999999999999999第 4 例正是经典浮点问题0.7 0.1 ! 0.8的直接体现而第 5 例说明 JS 数值在解析阶段就已把2e308变成了Infinity十进制库也无力回天。因此对财务、科学计算等敏感场景应以字符串或 bigint形式传入原始值。3.2 字符串中的下划线分隔符与 JS 数值字面量一致字符串中允许使用下划线作为分隔符以提升可读性x new Decimal(2_147_483_647)3.3 二进制、十六进制与八进制输入带相应前缀的字符串同样被接受README 给出完整示例x new Decimal(0xff.f) // 255.9375 y new Decimal(0b10101100) // 172 z x.plus(y) // 427.9375 z.toBinary() // 0b110101011.1111 z.toBinary(13) // 0b1.101010111111p8 // 用二进制指数记法构造出 Number.MAX_VALUE 的精确 Decimal 值 x new Decimal(0b1.1111111111111111111111111111111111111111111111111111p1023) // 1.7976931348623157081e308该能力的实现依据在 decimal.js源码中定义了isBinary、isHex、isOctal、isDecimal四组正则分别匹配0b/0x/0o前缀及可选的p指数二进制浮点指数记法。对应地实例方法toBinary、toHex、toOctal别名见下负责反向输出测试覆盖见 test/modules/toBinary.js、test/modules/toHex.js、test/modules/toOctal.js。四、不可变性与链式调用README 强调Decimal 实例是不可变的immutable——所有方法都不会修改调用它的实例而是返回新值0.3 - 0.1 // 0.19999999999999998 x new Decimal(0.3) x.minus(0.1) // 0.2 x // 0.3因此返回 Decimal 的方法可以自由链式调用x.dividedBy(y).plus(z).times(9).floor() x.times(1.23456780123456789e9).plus(9876.5432321).dividedBy(4444562598.111772).ceil()仓库中的 test/modules/immutability.js 对所有适用方法均不修改操作数进行了系统化回归它对每个运算abs、cos、div、pow、toFraction 等都会先复制操作数副本执行方法后再断言副本与原值完全相等T.assertEqualDecimal(a, aa)从而把不可变性固化为可验证的契约。该文件同时还在验证实例方法与其对应静态方法如a.cos()与Decimal.cos(a)结果一致。五、API 全景复制 Number.prototype 与 MathREADME 指出库复制了 JavaScriptNumber.prototype与Math的绝大多数方法。这一点可从两处得到源码级确认实例原型方法表decimal.js 头部列出完整映射表absoluteValue abs、comparedTo cmp、dividedBy div、squareRoot sqrt、toPower pow、naturalExponential exp、naturalLogarithm ln等并说明每个方法都有短别名静态方法注册decimal.js 中Decimal.abs abs、Decimal.sqrt sqrt、Decimal.pow pow等逐一挂载且 ES6 风格方法acosh、asinh、cbrt、clamp、cosh、hypot、log10、log2、sign、sinh、tanh、trunc在代码注释中明确标注。README 中的格式化示例展示了与 JS 原生一致的语义x new Decimal(255.5) x.toExponential(5) // 2.55500e2 x.toFixed(5) // 255.50000 x.toPrecision(5) // 255.50 Decimal.sqrt(6.98372465832e9823) // 8.3568682281821340204e4911 Decimal.pow(2, 0.0979843) // 1.0702770511687781839其中Decimal.sqrt直接对字符串求平方根并返回有效数字达 20 位的结果直观说明任意精度的含义Decimal.pow支持非整数指数。另有一个实用技巧用toFixed()避免指数记法x new Decimal(0.0000001) x.toString() // 1e-7 x.toFixed() // 0.00000015.1 别名速查README 强调许多方法名有更短的别名并给出验证x.squareRoot().dividedBy(y).toPower(3).equals(x.sqrt().div(y).pow(3)) // true x.comparedTo(y.modulo(z).negated() x.cmp(y.mod(z).neg()) // true即squareRoot→sqrt、dividedBy→div、toPower→pow、comparedTo→cmp、modulo→mod、negated→neg。此外完整别名体系还包括abs、clamp、cos/cosh/sin/sinh/tan/tanh、dp、divToInt、eq/gt/gte/lt/lte、mul、sub、sd、toDP/toSD、toHex、trunc等均可在 decimal.js 的映射表中逐条核对也体现在 decimal.d.ts 的成对类型声明中如absoluteValue(): Decimal; abs(): Decimal;。5.2 特殊值NaN 与 Infinity由于NaN与Infinity是合法的 Decimal 值库提供了isNaN与isFinite方法x new Decimal(NaN) // NaN y new Decimal(Infinity) // Infinity x.isNaN() !y.isNaN() !x.isFinite() !y.isFinite() // true5.3 有理数化toFractiontoFraction可将 Decimal 转为最接近的分数并支持可选的最大分母参数z new Decimal(355) pi z.dividedBy(113) // 3.1415929204 pi.toFraction() // [ 7853982301, 2500000000 ] pi.toFraction(1000) // [ 355, 113 ]不传参数时返回按当前精度近似的最简分数传入最大分母 1000 后355/113著名的祖率近似成为最接近的有理近似。该方法的专项测试位于 test/modules/toFraction.jsREADME 也以此文件作为单个测试模块可独立运行的示例。六、精度模型有效数字 vs 小数位数README 用一个关键对比说明了本库与 bignumber.js 的根本差异在 bignumber.js 中精度由小数位数指定而本库以有效数字指定且所有计算不只是除法都按该精度舍入这与 Python 的decimal模块一致。该设计贯穿整个实现precision决定每次运算结果保留多少位有效数字rounding决定如何舍入。README 给出配置与效果示例// 设置默认 Decimal 构造器的精度与舍入模式 Decimal.set({ precision: 5, rounding: 4 }) // 创建另一个 Decimal 构造器可选择性传入配置对象 Dec Decimal.clone({ precision: 9, rounding: 1 }) x new Decimal(5) y new Dec(5) x.div(3) // 1.6667 (5 位有效数字, ROUND_HALF_UP) y.div(3) // 1.66666666 (9 位有效数字, ROUND_DOWN)注意此处x.div(3)结果为1.66675 位有效数字、y.div(3)为1.666666669 位有效数字同一表达式因构造器配置不同而结果不同这正是每个构造器独立配置的价值。七、配置体系precision、rounding、modulo 与更多README 指出所有计算依据构造器的precision与rounding属性舍入并可通过Decimal.setconfig的别名源码见 decimal.js在运行时修改。完整的配置项定义集中在 decimal.js 的DEFAULTS块中全部 8 项如下配置项默认值合法范围含义precision201 ~ 1e9计算结果或进制转换保留的最大有效数字位数rounding40 ~ 8舍入模式见下表modulo10 ~ 9取模运算使用的商舍入模式见下文toExpNeg-70 ~ -EXP_LIMIT指数小于等于该值时toString改用指数记法toExpPos210 ~ EXP_LIMIT指数大于等于该值时toString改用指数记法minE-EXP_LIMIT-1 ~ -EXP_LIMIT最小指数低于该值下溢为 0maxEEXP_LIMIT1 ~ EXP_LIMIT最大指数高于该值上溢为 Infinitycryptofalsetrue/false是否使用密码学安全随机数Decimal.random用其中EXP_LIMIT 9e15、MAX_DIGITS 1e9是源码中定义的两个上限常量decimal.jstoExpNeg/toExpPos的默认值 -7/21 与 JS 数值的指数记法阈值一致注释中明确标注了对照JavaScript numbers: -7 / 21。config函数的参数校验逻辑见 decimal.js所有数值参数必须为整数且在区间内否则抛出DecimalError: Invalid argumentcrypto仅在环境提供crypto.getRandomValues或crypto.randomBytes时才可设为 true否则抛crypto unavailable。7.1 九种舍入模式rounding 08源码 decimal.js 的注释对 08 共 9 种模式给出精确定义并注册为构造器常量ROUND_UP~ROUND_HALF_FLOOR见 decimal.js值常量规则0ROUND_UP远离零1ROUND_DOWN趋向零2ROUND_CEIL趋向 ∞3ROUND_FLOOR趋向 -∞4ROUND_HALF_UP就近舍入平局时向上5ROUND_HALF_DOWN就近舍入平局时向下6ROUND_HALF_EVEN就近舍入平局时趋向偶数银行家舍入7ROUND_HALF_CEIL就近舍入平局时趋向 ∞8ROUND_HALF_FLOOR就近舍入平局时趋向 -∞默认值 4 即ROUND_HALF_UP与日常四舍五入习惯一致需要 IEEE 754 风格舍入时可改用 6ROUND_HALF_EVEN。7.2 modulo 模式09modulo配置决定a mod n的语义源码注释decimal.js说明商q a / n按对应舍入模式计算余数r a - n * q。常用值有值常量语义0ROUND_UP被除数为负则余数为正否则为负1ROUND_DOWN余数符号与被除数一致即 JS 原生%3ROUND_FLOOR余数符号与除数一致即 Python%6ROUND_HALF_EVENIEEE 754 remainder 函数9EUCLID欧几里得除法余数恒为正默认值 1 与 JavaScript 的%运算符行为一致其余舍入模式虽也允许使用但源码注释提醒可能得不到有用的结果。EUCLID常量同样注册在构造器上decimal.js并在 decimal.d.ts 中以type Modulo Rounding | 9表达。八、clone多构造器隔离配置README 说明为支持高级用法可创建多个 Decimal 构造器每个拥有独立配置作用于由它创建的所有 Decimal。这就是Decimal.clone的用途Dec Decimal.clone({ precision: 9, rounding: 1 })从源码看decimal.jsclone会返回一个新的Decimal构造函数其原型共享自P但配置独立若传入对象未显式给出某配置项则继承当前构造器的对应值obj[p] this[p]除非传了defaults: true才重置为出厂默认。随后调用Decimal.config(obj)完成校验与设置。也就是说clone是基于当前配置的拷贝这使同一应用内可以并存不同精度/舍入策略的数域互不干扰。Decimal.config与Decimal.set是同一个函数源码Decimal.config Decimal.set configclone亦可通过Decimal.clone调用。九、内部存储结构d、e、sREADME 明确指出Decimal 的值以浮点格式存储为**数字digits、指数exponent、符号sign**三部分且这些属性应视为只读x new Decimal(-12345.67); x.d // [ 12345, 6700000 ] digits (base 10000000) x.e // 4 exponent (base 10) x.s // -1 sign这里的d是以BASE 1e7即千万进制LOG_BASE 7存储的数字分段数组每个元素是 09999999 的整数[12345, 6700000]表示12345 * 1e7 6700000再按指数e4定位小数点e是以 10 为底的指数s为-1/1NaN 时为 NaN。这两个内部常量定义于 decimal.js。类型层面decimal.d.ts 将三者声明为只读属性readonly d: number[]、readonly e: number、readonly s: number与 README应视为只读的告诫一致。测试框架中的T.assertEqualProps(digits, exponent, sign, n)test/setup.js正是按这三元组逐位断言内部表示是否正确。十、TypeScript 支持仓库内置 decimal.d.tsREADME 将其列为特性之一。该文件不仅声明了Decimal类及其全部实例方法还导出Decimal.Constructor、Decimal.Instance、Decimal.Rounding、Decimal.Modulo、Decimal.Value、Decimal.Config等类型工具支持import {Decimal} from decimal.js与默认导入两种风格文件头部还建议开启--strictNullChecks编译选项以获得更严格的类型检查。package.json的exports.types与顶层types字段均指向该文件保证 TS/打包器能正确解析类型。十一、测试npm test、单模块与浏览器README 提供三种运行测试的方式仓库均已就绪1. 全量测试Node.js从仓库根目录npm test该命令由 package.json 的scripts.test定义为node ./test/test.js。入口 test/test.js 会依次require60 个测试模块abs、acos、atan2、clone、config、immutability、toFraction、trig 系列等汇总每个模块的T.result并打印总数与耗时。2. 单模块测试node test/modules/toFraction每个测试模块如 test/modules/toFraction.js都以if (typeof T undefined) require(../setup)自举因此可独立运行test/setup.js 提供全局测试框架T断言、异常捕获、不可变性检查等并兼容浏览器环境typeof window分支。3. 浏览器测试直接打开 test/test.html 即可在浏览器内运行同一套测试setup.js检测到window后把结果写入document.body。此外仓库还附带 test/hypothesis/ 目录含evaluate.mjs、error_hunt.py、requirements.txt与说明文件从目录结构可以推断其用途是基于 Python Hypothesis 框架对三角函数、双曲函数等高阶运算进行性质测试与误差排查的补充工具适合对数值正确性做更深入验证的读者。十二、压缩MinifyREADME 给出两套压缩方案分别针对 CommonJS 版与 ES Module 版方案一uglify-js 压缩 decimal.jsnpm install uglify-js -g uglifyjs decimal.js --source-map urldecimal.min.js.map -c -m -o decimal.min.js方案二terser 压缩 decimal.mjsnpm install terser -g terser decimal.mjs --source-map urldecimal.min.mjs.map -c -m --toplevel -o decimal.min.mjs压缩后的 ES 模块按常规方式导入使用import Decimal from ./decimal.min.mjs;两条命令均开启了压缩-c与变量名混淆-m并生成 source mapterser 额外使用--toplevel以更激进地压缩顶层作用域适合体积敏感的浏览器场景。十三、许可协议本仓库遵循 MIT 许可详见 LICENCE.md更完整的 API 逐方法说明可查阅 doc/API.html 文档README 亦推荐以此作为进一步阅读的 API 参考。小结围绕 README.md 这条主线本文覆盖了 decimal.js 从加载、构造、精度模型、配置体系到内部表示、测试与压缩的完整链路并以 decimal.js 源码中的DEFAULTS配置块、config/clone实现、d/e/s存储结构与 test/ 下的回归测试作为实现证据。核心要点可归纳为以字符串传入高精度字面量、用有效数字思维理解precision、按业务语义挑选 9 种rounding与 5 种常用modulo模式、以clone隔离多精度数域以及把不可变性和方法别名当作日常编码习惯来使用——这样即可在 JavaScript 中安全、精确地完成任意精度十进制运算。赞分享科学计算【免费下载链接】decimal.jsAn arbitrary-precision Decimal type for JavaScript项目地址https://gitcode.com/gh_mirrors/de/decimal.js点击查看免费下载相关推荐decimal.js 任意精度 Decimal 类型库安装和配置指南decimal.js 任意精度 Decimal 类型库安装和配置指南 1. 项目基础介绍和主要的编程语言 项目基础介绍 decimal.js 是一个用于 Jav科学计算gh_mirrors/re/renaming实战案例大规模仓库批量重命名最佳实践gh_mirrors/re/renaming实战案例大规模仓库批量重命名最佳实践 在现代软件开发中版本控制是项目管理的核心环节而分支管理更是其中的关键组成decimal.js源码解读从Decimal类设计看高精度算法实现decimal.js源码解读从Decimal类设计看高精度算法实现 引言浮点数精度困境与解决方案 你是否曾遇到过这样的JavaScript计算结果 jav科学计算上一篇终极Helmfile自动化部署指南从零构建企业级CI/CD流水线的最佳实践下一篇XNAGameStudio物理与AI示例深度解析打造智能游戏角色创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考