<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>阳光梦想</title><link>https://www.yangguangdream.com/</link><description>分享福利与生活的个人博客</description><item><title>解决 Xcode 26 编译报错 Use of private header from outside its module: netinet6/in6.h</title><link>https://www.yangguangdream.com/?id=2273</link><description>&lt;h2&gt;报错信息&lt;br/&gt;&lt;/h2&gt;&lt;pre class=&quot;prism-highlight prism-language-markdown&quot;&gt;Use&amp;nbsp;of&amp;nbsp;private&amp;nbsp;header&amp;nbsp;from&amp;nbsp;outside&amp;nbsp;its&amp;nbsp;module:&amp;nbsp;&amp;#39;netinet6/in6.h&amp;#39;&lt;/pre&gt;&lt;h2&gt;文件路径&lt;br/&gt;&lt;/h2&gt;&lt;pre class=&quot;prism-highlight prism-language-markdown&quot;&gt;Pods/AFNetworking/AFNetworking/AFNetworking/AFHTTPSessionManager.m:32:9
Pods/AFNetworking/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m:26:9&lt;/pre&gt;&lt;h2&gt;问题原因&lt;br/&gt;&lt;/h2&gt;&lt;p&gt;新版 Xcode（Xcode 26+）升级了 SDK，将&amp;nbsp;&amp;lt;netinet6/in6.h&amp;gt;&amp;nbsp;标记为模块私有头文件（private header），禁止从模块外部直接&amp;nbsp;#import。&lt;/p&gt;&lt;p&gt;这两个文件头部都引用了&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-objectivec&quot;&gt;#import&amp;nbsp;&amp;lt;netinet6/in6.h&amp;gt;&lt;/pre&gt;&lt;p&gt;由于&amp;nbsp;&amp;lt;netinet/in.h&amp;gt;&amp;nbsp;已经间接包含了 IPv6 相关的类型定义，这行&amp;nbsp;#import&amp;nbsp;实际上是多余的，删除即可~&lt;/p&gt;&lt;h2&gt;解决方案&lt;br/&gt;&lt;/h2&gt;&lt;p&gt;1、在&amp;nbsp;Podfile&amp;nbsp;的&amp;nbsp;post_install&amp;nbsp;钩子中加入以下代码，每次&amp;nbsp;pod install&amp;nbsp;后自动扫描并修复所有受影响的文件&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-ruby&quot;&gt;post_install&amp;nbsp;do&amp;nbsp;|installer|
&amp;nbsp;&amp;nbsp;#&amp;nbsp;...&amp;nbsp;其他配置&amp;nbsp;...

&amp;nbsp;&amp;nbsp;#&amp;nbsp;修复新版&amp;nbsp;Xcode&amp;nbsp;SDK&amp;nbsp;中&amp;nbsp;netinet6/in6.h&amp;nbsp;私有头文件问题
&amp;nbsp;&amp;nbsp;#&amp;nbsp;全局扫描
&amp;nbsp;&amp;nbsp;Dir.glob(&amp;#39;Pods/**/*.{m,mm}&amp;#39;).each&amp;nbsp;do&amp;nbsp;|file|
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content&amp;nbsp;=&amp;nbsp;File.read(file)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;content.include?(&amp;quot;#import&amp;nbsp;&amp;lt;netinet6/in6.h&amp;gt;&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content.gsub!(&amp;quot;#import&amp;nbsp;&amp;lt;netinet6/in6.h&amp;gt;\n&amp;quot;,&amp;nbsp;&amp;#39;&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;移除只读限制
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;File.chmod(0644,&amp;nbsp;file)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;File.write(file,&amp;nbsp;content)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;puts&amp;nbsp;&amp;quot;已修复&amp;nbsp;#{file}&amp;nbsp;的&amp;nbsp;netinet6/in6.h&amp;nbsp;问题&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end
&amp;nbsp;&amp;nbsp;end
end&lt;/pre&gt;&lt;p&gt;2、执行 pod install 后会看到如下输出&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-markdown&quot;&gt;已修复&amp;nbsp;Pods/AFNetworking/AFNetworking/AFNetworking/AFNetworkReachabilityManager.m&amp;nbsp;的&amp;nbsp;netinet6/in6.h&amp;nbsp;问题
已修复&amp;nbsp;Pods/AFNetworking/AFNetworking/AFNetworking/AFHTTPSessionManager.m&amp;nbsp;的&amp;nbsp;netinet6/in6.h&amp;nbsp;问题&lt;/pre&gt;&lt;p&gt;3、也可以直接用我的fork（集成了隐私清单，仅作为网络请求库的情况）&lt;/p&gt;&lt;p&gt;编辑 Podfile 把 AFNetworking 这部分改成这样~&amp;nbsp;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-ruby&quot;&gt;pod&amp;nbsp;&amp;#39;AFNetworking&amp;#39;,&amp;nbsp;:git&amp;nbsp;=&amp;gt;&amp;nbsp;&amp;#39;https://github.com/xiaozhongmiao/AFNetworking.git&amp;#39;,&amp;nbsp;:tag&amp;nbsp;=&amp;gt;&amp;nbsp;&amp;#39;4.0.1-privacy&amp;#39;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 30 Apr 2026 10:41:25 +0800</pubDate></item><item><title>vscode 里面没有远程分支的解决方案</title><link>https://www.yangguangdream.com/?id=2272</link><description>&lt;p&gt;在终端里面、当前项目目录执行这个就可以&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-powershell&quot;&gt;git&amp;nbsp;remote&amp;nbsp;update&amp;nbsp;origin&amp;nbsp;--prune&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 06 Mar 2026 18:52:45 +0800</pubDate></item><item><title>【代码】Haversine 距离计算的Java实现</title><link>https://www.yangguangdream.com/?id=2271</link><description>&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;h1&gt;1、介绍&lt;/h1&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;Haversine 距离用于计算地球上两点之间的大圆距离&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;当考虑地球真实曲率时，它特别适用于计算两个经纬度坐标之间的距离&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://www.yangguangdream.com/zb_users/upload/2026/02/202602251772016729375482.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;h1&gt;2、Java实现&lt;br/&gt;&lt;/h1&gt;&lt;pre class=&quot;prism-highlight prism-language-java&quot;&gt;public&amp;nbsp;class&amp;nbsp;HaversineUtil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Great-circle&amp;nbsp;distance&amp;nbsp;on&amp;nbsp;a&amp;nbsp;spherical&amp;nbsp;Earth&amp;nbsp;using&amp;nbsp;the&amp;nbsp;haversine&amp;nbsp;formula.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;返回两点间球面最短距离（大圆距离）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;注意：
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;-&amp;nbsp;结果适用于大多数业务距离计算（附近/范围/配送），属于“球体近似”。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;-&amp;nbsp;单位：公里（km）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;double&amp;nbsp;haversineDistanceKm(double&amp;nbsp;lat1,&amp;nbsp;double&amp;nbsp;lon1,&amp;nbsp;double&amp;nbsp;lat2,&amp;nbsp;double&amp;nbsp;lon2)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;平均地球半径（km），用&amp;nbsp;6371.0&amp;nbsp;也可以
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;final&amp;nbsp;double&amp;nbsp;R_KM&amp;nbsp;=&amp;nbsp;6371.0088;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;validateLatLon(lat1,&amp;nbsp;lon1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;validateLatLon(lat2,&amp;nbsp;lon2);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;归一化经度到&amp;nbsp;[-180,&amp;nbsp;180)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lon1&amp;nbsp;=&amp;nbsp;normalizeLonDeg(lon1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lon2&amp;nbsp;=&amp;nbsp;normalizeLonDeg(lon2);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;计算差值（经度差做最短角差归一化，避免跨国际日期变更线时误差）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double&amp;nbsp;dLatDeg&amp;nbsp;=&amp;nbsp;lat2&amp;nbsp;-&amp;nbsp;lat1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double&amp;nbsp;dLonDeg&amp;nbsp;=&amp;nbsp;shortestDeltaLonDeg(lon1,&amp;nbsp;lon2);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double&amp;nbsp;dLat&amp;nbsp;=&amp;nbsp;Math.toRadians(dLatDeg);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double&amp;nbsp;dLon&amp;nbsp;=&amp;nbsp;Math.toRadians(dLonDeg);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double&amp;nbsp;rLat1&amp;nbsp;=&amp;nbsp;Math.toRadians(lat1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double&amp;nbsp;rLat2&amp;nbsp;=&amp;nbsp;Math.toRadians(lat2);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double&amp;nbsp;sinDLat&amp;nbsp;=&amp;nbsp;Math.sin(dLat&amp;nbsp;/&amp;nbsp;2.0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double&amp;nbsp;sinDLon&amp;nbsp;=&amp;nbsp;Math.sin(dLon&amp;nbsp;/&amp;nbsp;2.0);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double&amp;nbsp;a&amp;nbsp;=&amp;nbsp;sinDLat&amp;nbsp;*&amp;nbsp;sinDLat
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+&amp;nbsp;Math.cos(rLat1)&amp;nbsp;*&amp;nbsp;Math.cos(rLat2)&amp;nbsp;*&amp;nbsp;sinDLon&amp;nbsp;*&amp;nbsp;sinDLon;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;浮点保护：防止极端情况下&amp;nbsp;a&amp;nbsp;略超出&amp;nbsp;[0,1]&amp;nbsp;导致&amp;nbsp;NaN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a&amp;nbsp;=&amp;nbsp;Math.min(1.0,&amp;nbsp;Math.max(0.0,&amp;nbsp;a));

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double&amp;nbsp;c&amp;nbsp;=&amp;nbsp;2.0&amp;nbsp;*&amp;nbsp;Math.atan2(Math.sqrt(a),&amp;nbsp;Math.sqrt(1.0&amp;nbsp;-&amp;nbsp;a));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;R_KM&amp;nbsp;*&amp;nbsp;c;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Great-circle&amp;nbsp;distance&amp;nbsp;on&amp;nbsp;a&amp;nbsp;spherical&amp;nbsp;Earth&amp;nbsp;using&amp;nbsp;the&amp;nbsp;haversine&amp;nbsp;formula.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;返回两点间球面最短距离（大圆距离）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;注意：
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;-&amp;nbsp;结果适用于大多数业务距离计算（附近/范围/配送），属于“球体近似”。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;-&amp;nbsp;单位：米（m）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;double&amp;nbsp;haversineDistanceMeters(double&amp;nbsp;lat1,&amp;nbsp;double&amp;nbsp;lon1,&amp;nbsp;double&amp;nbsp;lat2,&amp;nbsp;double&amp;nbsp;lon2)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;haversineDistanceKm(lat1,&amp;nbsp;lon1,&amp;nbsp;lat2,&amp;nbsp;lon2)&amp;nbsp;*&amp;nbsp;1000.0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&amp;nbsp;校验纬度/经度输入是否合理&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;void&amp;nbsp;validateLatLon(double&amp;nbsp;lat,&amp;nbsp;double&amp;nbsp;lon)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!Double.isFinite(lat)&amp;nbsp;||&amp;nbsp;!Double.isFinite(lon))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;IllegalArgumentException(&amp;quot;lat/lon&amp;nbsp;must&amp;nbsp;be&amp;nbsp;finite&amp;nbsp;numbers&amp;nbsp;(not&amp;nbsp;NaN/Infinity).&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(lat&amp;nbsp;&amp;lt;&amp;nbsp;-90.0&amp;nbsp;||&amp;nbsp;lat&amp;nbsp;&amp;gt;&amp;nbsp;90.0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;IllegalArgumentException(&amp;quot;lat&amp;nbsp;out&amp;nbsp;of&amp;nbsp;range&amp;nbsp;[-90,&amp;nbsp;90]:&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;lat);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&amp;nbsp;把经度归一化到&amp;nbsp;[-180,&amp;nbsp;180)&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;double&amp;nbsp;normalizeLonDeg(double&amp;nbsp;lon)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;结果落在&amp;nbsp;[-180,&amp;nbsp;180)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lon&amp;nbsp;=&amp;nbsp;((lon&amp;nbsp;+&amp;nbsp;180.0)&amp;nbsp;%&amp;nbsp;360.0&amp;nbsp;+&amp;nbsp;360.0)&amp;nbsp;%&amp;nbsp;360.0&amp;nbsp;-&amp;nbsp;180.0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;lon;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&amp;nbsp;计算两经度的最短角差（单位：度），结果落在&amp;nbsp;[-180,&amp;nbsp;180]&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;double&amp;nbsp;shortestDeltaLonDeg(double&amp;nbsp;lon1,&amp;nbsp;double&amp;nbsp;lon2)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double&amp;nbsp;d&amp;nbsp;=&amp;nbsp;lon2&amp;nbsp;-&amp;nbsp;lon1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;归一化到&amp;nbsp;(-180,&amp;nbsp;180]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d&amp;nbsp;=&amp;nbsp;((d&amp;nbsp;+&amp;nbsp;180.0)&amp;nbsp;%&amp;nbsp;360.0&amp;nbsp;+&amp;nbsp;360.0)&amp;nbsp;%&amp;nbsp;360.0&amp;nbsp;-&amp;nbsp;180.0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;d;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 25 Feb 2026 18:50:31 +0800</pubDate></item><item><title>在 JavaScript 中实现 BigDecimal</title><link>https://www.yangguangdream.com/?id=2270</link><description>&lt;p&gt;最近项目要求，在前端计算单价，由于 JavaScript 是二进制浮点，十进制小数（比如：0.1、0.01、19.99）在二进制表示不精确，直接运算会得到一个很接近但是不等于的结果。而价格这个东西对于精度又极其敏感。&lt;br/&gt;&lt;/p&gt;&lt;p&gt;看到 Java 中是用BigDecimal进行计算的，所以，我这在 JavaScript 中实现了相近的功能&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;h2&gt;实现代码（ES2020以上）：&lt;/h2&gt;&lt;pre class=&quot;prism-highlight prism-language-typescript&quot;&gt;/*&amp;nbsp;BigDecimal.ts
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;https://www.yangguangdream.com/?id=2270
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;精確十進位運算（BigInt&amp;nbsp;+&amp;nbsp;scale&amp;nbsp;定點小數）
&amp;nbsp;*&amp;nbsp;Precise&amp;nbsp;decimal&amp;nbsp;arithmetic&amp;nbsp;using&amp;nbsp;BigInt&amp;nbsp;+&amp;nbsp;scale&amp;nbsp;(fixed-point).
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;建議&amp;nbsp;TS&amp;nbsp;target&amp;nbsp;/&amp;nbsp;lib:&amp;nbsp;ES2020&amp;nbsp;以上（需要&amp;nbsp;BigInt）
&amp;nbsp;*&amp;nbsp;Recommended&amp;nbsp;TS&amp;nbsp;target/lib:&amp;nbsp;ES2020+&amp;nbsp;(BigInt&amp;nbsp;required).
&amp;nbsp;*/

export&amp;nbsp;type&amp;nbsp;RoundingMode&amp;nbsp;=
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;quot;DOWN&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;toward&amp;nbsp;zero
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;quot;UP&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;away&amp;nbsp;from&amp;nbsp;zero
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;quot;FLOOR&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;toward&amp;nbsp;-∞
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;quot;CEILING&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;toward&amp;nbsp;+∞
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;quot;HALF_UP&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;ties&amp;nbsp;away&amp;nbsp;from&amp;nbsp;zero
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;quot;HALF_DOWN&amp;quot;&amp;nbsp;&amp;nbsp;//&amp;nbsp;ties&amp;nbsp;toward&amp;nbsp;zero
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;quot;HALF_EVEN&amp;quot;;&amp;nbsp;//&amp;nbsp;banker&amp;#39;s&amp;nbsp;rounding

export&amp;nbsp;interface&amp;nbsp;MathContext&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&amp;nbsp;有效位數（precision），必須&amp;nbsp;&amp;gt;=&amp;nbsp;1。Significant&amp;nbsp;digits&amp;nbsp;(precision),&amp;nbsp;must&amp;nbsp;be&amp;nbsp;&amp;gt;=&amp;nbsp;1.&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;precision:&amp;nbsp;number;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&amp;nbsp;捨入模式。Rounding&amp;nbsp;mode.&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roundingMode:&amp;nbsp;RoundingMode;
}

export&amp;nbsp;class&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&amp;nbsp;去掉小數點後的整數值（可能為負）。Unscaled&amp;nbsp;integer&amp;nbsp;value&amp;nbsp;(may&amp;nbsp;be&amp;nbsp;negative).&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;readonly&amp;nbsp;intVal:&amp;nbsp;bigint;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&amp;nbsp;小數位數（&amp;gt;=&amp;nbsp;0）。Scale&amp;nbsp;(digits&amp;nbsp;to&amp;nbsp;the&amp;nbsp;right&amp;nbsp;of&amp;nbsp;the&amp;nbsp;decimal&amp;nbsp;point,&amp;nbsp;&amp;gt;=&amp;nbsp;0).&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;readonly&amp;nbsp;scale:&amp;nbsp;number;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;建立&amp;nbsp;BigDecimal。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;-&amp;nbsp;建議使用字串輸入以確保「完全精確」。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;-&amp;nbsp;number&amp;nbsp;會先轉字串，可能已經有二進位浮點誤差。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Create&amp;nbsp;a&amp;nbsp;BigDecimal.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;-&amp;nbsp;Prefer&amp;nbsp;string&amp;nbsp;input&amp;nbsp;for&amp;nbsp;exactness.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;-&amp;nbsp;number&amp;nbsp;is&amp;nbsp;converted&amp;nbsp;to&amp;nbsp;string&amp;nbsp;and&amp;nbsp;may&amp;nbsp;already&amp;nbsp;contain&amp;nbsp;IEEE-754&amp;nbsp;rounding&amp;nbsp;artifacts.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;constructor(value:&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint&amp;nbsp;|&amp;nbsp;BigDecimal,&amp;nbsp;scale?:&amp;nbsp;number)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(value&amp;nbsp;instanceof&amp;nbsp;BigDecimal)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.intVal&amp;nbsp;=&amp;nbsp;value.intVal;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.scale&amp;nbsp;=&amp;nbsp;value.scale;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(typeof&amp;nbsp;value&amp;nbsp;===&amp;nbsp;&amp;quot;bigint&amp;quot;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;s&amp;nbsp;=&amp;nbsp;scale&amp;nbsp;??&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!Number.isInteger(s)&amp;nbsp;||&amp;nbsp;s&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;scale&amp;nbsp;must&amp;nbsp;be&amp;nbsp;a&amp;nbsp;non-negative&amp;nbsp;integer&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.intVal&amp;nbsp;=&amp;nbsp;value&amp;nbsp;===&amp;nbsp;0n&amp;nbsp;?&amp;nbsp;0n&amp;nbsp;:&amp;nbsp;value;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.scale&amp;nbsp;=&amp;nbsp;s;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(typeof&amp;nbsp;value&amp;nbsp;===&amp;nbsp;&amp;quot;number&amp;quot;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!Number.isFinite(value))&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;Invalid&amp;nbsp;number&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value&amp;nbsp;=&amp;nbsp;String(value);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;parsed&amp;nbsp;=&amp;nbsp;BigDecimal.parseDecimalString(value);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.intVal&amp;nbsp;=&amp;nbsp;parsed.intVal&amp;nbsp;===&amp;nbsp;0n&amp;nbsp;?&amp;nbsp;0n&amp;nbsp;:&amp;nbsp;parsed.intVal;&amp;nbsp;//&amp;nbsp;avoid&amp;nbsp;-0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.scale&amp;nbsp;=&amp;nbsp;parsed.scale;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}


&amp;nbsp;&amp;nbsp;&amp;nbsp;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;快速建立實例（同&amp;nbsp;constructor）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Convenience&amp;nbsp;factory&amp;nbsp;(same&amp;nbsp;as&amp;nbsp;constructor).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static&amp;nbsp;from(value:&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint&amp;nbsp;|&amp;nbsp;BigDecimal,&amp;nbsp;scale?:&amp;nbsp;number):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;new&amp;nbsp;BigDecimal(value&amp;nbsp;as&amp;nbsp;any,&amp;nbsp;scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;取得&amp;nbsp;scale（小數位數）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Get&amp;nbsp;scale&amp;nbsp;(digits&amp;nbsp;after&amp;nbsp;decimal&amp;nbsp;point).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getScale():&amp;nbsp;number&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.scale;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;取得未縮放整數值（unscaled&amp;nbsp;value）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Get&amp;nbsp;unscaled&amp;nbsp;value&amp;nbsp;(BigInt).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unscaledValue():&amp;nbsp;bigint&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.intVal;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;回傳數值的正負號（-1,&amp;nbsp;0,&amp;nbsp;1）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Returns&amp;nbsp;signum&amp;nbsp;of&amp;nbsp;this&amp;nbsp;value&amp;nbsp;(-1,&amp;nbsp;0,&amp;nbsp;1).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;signum():&amp;nbsp;-1&amp;nbsp;|&amp;nbsp;0&amp;nbsp;|&amp;nbsp;1&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(this.intVal&amp;nbsp;===&amp;nbsp;0n)&amp;nbsp;return&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.intVal&amp;nbsp;&amp;lt;&amp;nbsp;0n&amp;nbsp;?&amp;nbsp;-1&amp;nbsp;:&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;取絕對值。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Absolute&amp;nbsp;value.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;abs():&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.intVal&amp;nbsp;&amp;lt;&amp;nbsp;0n&amp;nbsp;?&amp;nbsp;new&amp;nbsp;BigDecimal(-this.intVal,&amp;nbsp;this.scale)&amp;nbsp;:&amp;nbsp;this;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;取相反數（negate）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Negation.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;negate():&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.intVal&amp;nbsp;===&amp;nbsp;0n&amp;nbsp;?&amp;nbsp;this&amp;nbsp;:&amp;nbsp;new&amp;nbsp;BigDecimal(-this.intVal,&amp;nbsp;this.scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;加法（結果&amp;nbsp;scale&amp;nbsp;=&amp;nbsp;max(a.scale,&amp;nbsp;b.scale)，與&amp;nbsp;Java&amp;nbsp;BigDecimal.add&amp;nbsp;類似）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Addition&amp;nbsp;(result&amp;nbsp;scale&amp;nbsp;=&amp;nbsp;max&amp;nbsp;scales,&amp;nbsp;Java-like).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add(other:&amp;nbsp;BigDecimal&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;b&amp;nbsp;=&amp;nbsp;BigDecimal.from(other);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;[aAdj,&amp;nbsp;bAdj,&amp;nbsp;s]&amp;nbsp;=&amp;nbsp;BigDecimal.alignScales(this,&amp;nbsp;b);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;new&amp;nbsp;BigDecimal(aAdj&amp;nbsp;+&amp;nbsp;bAdj,&amp;nbsp;s);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;減法（結果&amp;nbsp;scale&amp;nbsp;=&amp;nbsp;max(a.scale,&amp;nbsp;b.scale)，與&amp;nbsp;Java&amp;nbsp;BigDecimal.subtract&amp;nbsp;類似）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Subtraction&amp;nbsp;(result&amp;nbsp;scale&amp;nbsp;=&amp;nbsp;max&amp;nbsp;scales,&amp;nbsp;Java-like).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sub(other:&amp;nbsp;BigDecimal&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;b&amp;nbsp;=&amp;nbsp;BigDecimal.from(other);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;[aAdj,&amp;nbsp;bAdj,&amp;nbsp;s]&amp;nbsp;=&amp;nbsp;BigDecimal.alignScales(this,&amp;nbsp;b);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;new&amp;nbsp;BigDecimal(aAdj&amp;nbsp;-&amp;nbsp;bAdj,&amp;nbsp;s);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;乘法（結果&amp;nbsp;scale&amp;nbsp;=&amp;nbsp;a.scale&amp;nbsp;+&amp;nbsp;b.scale，與&amp;nbsp;Java&amp;nbsp;BigDecimal.multiply&amp;nbsp;類似）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Multiplication&amp;nbsp;(result&amp;nbsp;scale&amp;nbsp;=&amp;nbsp;sum&amp;nbsp;of&amp;nbsp;scales,&amp;nbsp;Java-like).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mul(other:&amp;nbsp;BigDecimal&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;b&amp;nbsp;=&amp;nbsp;BigDecimal.from(other);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;new&amp;nbsp;BigDecimal(this.intVal&amp;nbsp;*&amp;nbsp;b.intVal,&amp;nbsp;this.scale&amp;nbsp;+&amp;nbsp;b.scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;除法（Java&amp;nbsp;風格&amp;nbsp;overload）：
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;1)&amp;nbsp;divide(b)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;gt;&amp;nbsp;精確除法；若結果為無限小數，會拋錯（需指定&amp;nbsp;scale/rounding）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;2)&amp;nbsp;divide(b,&amp;nbsp;s,&amp;nbsp;rm)&amp;nbsp;-&amp;gt;&amp;nbsp;指定結果&amp;nbsp;scale&amp;nbsp;與捨入模式。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Division&amp;nbsp;(Java-like&amp;nbsp;overload):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;1)&amp;nbsp;divide(b)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;gt;&amp;nbsp;exact&amp;nbsp;division;&amp;nbsp;throws&amp;nbsp;if&amp;nbsp;non-terminating.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;2)&amp;nbsp;divide(b,&amp;nbsp;s,&amp;nbsp;rm)&amp;nbsp;-&amp;gt;&amp;nbsp;with&amp;nbsp;specified&amp;nbsp;result&amp;nbsp;scale&amp;nbsp;and&amp;nbsp;rounding&amp;nbsp;mode.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;divide(other:&amp;nbsp;BigDecimal&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint):&amp;nbsp;BigDecimal;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;divide(other:&amp;nbsp;BigDecimal&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint,&amp;nbsp;resultScale:&amp;nbsp;number,&amp;nbsp;rounding:&amp;nbsp;RoundingMode):&amp;nbsp;BigDecimal;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;divide(other:&amp;nbsp;BigDecimal&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint,&amp;nbsp;resultScale?:&amp;nbsp;number,&amp;nbsp;rounding?:&amp;nbsp;RoundingMode):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;b&amp;nbsp;=&amp;nbsp;BigDecimal.from(other);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(b.intVal&amp;nbsp;===&amp;nbsp;0n)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;Division&amp;nbsp;by&amp;nbsp;zero&amp;quot;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(resultScale&amp;nbsp;===&amp;nbsp;undefined)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.divideExact(b);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;rm:&amp;nbsp;RoundingMode&amp;nbsp;=&amp;nbsp;rounding&amp;nbsp;??&amp;nbsp;&amp;quot;HALF_UP&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.divideScaled(b,&amp;nbsp;resultScale,&amp;nbsp;rm);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;指定&amp;nbsp;scale（小數位）並捨入，等同&amp;nbsp;Java&amp;nbsp;BigDecimal.setScale。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Set&amp;nbsp;scale&amp;nbsp;with&amp;nbsp;rounding&amp;nbsp;(like&amp;nbsp;Java&amp;nbsp;BigDecimal.setScale).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setScale(newScale:&amp;nbsp;number,&amp;nbsp;rounding:&amp;nbsp;RoundingMode&amp;nbsp;=&amp;nbsp;&amp;quot;HALF_UP&amp;quot;):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!Number.isInteger(newScale)&amp;nbsp;||&amp;nbsp;newScale&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;newScale&amp;nbsp;must&amp;nbsp;be&amp;nbsp;a&amp;nbsp;non-negative&amp;nbsp;integer&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(newScale&amp;nbsp;===&amp;nbsp;this.scale)&amp;nbsp;return&amp;nbsp;this;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(newScale&amp;nbsp;&amp;gt;&amp;nbsp;this.scale)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;factor&amp;nbsp;=&amp;nbsp;BigDecimal.pow10(newScale&amp;nbsp;-&amp;nbsp;this.scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;new&amp;nbsp;BigDecimal(this.intVal&amp;nbsp;*&amp;nbsp;factor,&amp;nbsp;newScale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;diff&amp;nbsp;=&amp;nbsp;this.scale&amp;nbsp;-&amp;nbsp;newScale;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;divisor&amp;nbsp;=&amp;nbsp;BigDecimal.pow10(diff);&amp;nbsp;//&amp;nbsp;positive
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;{&amp;nbsp;q,&amp;nbsp;r&amp;nbsp;}&amp;nbsp;=&amp;nbsp;BigDecimal.divmodPosDenom(this.intVal,&amp;nbsp;divisor);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;roundedQ&amp;nbsp;=&amp;nbsp;BigDecimal.roundQuotient(q,&amp;nbsp;r,&amp;nbsp;divisor,&amp;nbsp;this.intVal,&amp;nbsp;rounding);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;new&amp;nbsp;BigDecimal(roundedQ,&amp;nbsp;newScale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;移除尾端多餘的&amp;nbsp;0（會改變&amp;nbsp;scale），等同&amp;nbsp;Java&amp;nbsp;BigDecimal.stripTrailingZeros。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Strip&amp;nbsp;trailing&amp;nbsp;zeros&amp;nbsp;(changes&amp;nbsp;scale),&amp;nbsp;like&amp;nbsp;Java&amp;nbsp;BigDecimal.stripTrailingZeros.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stripTrailingZeros():&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(this.intVal&amp;nbsp;===&amp;nbsp;0n)&amp;nbsp;return&amp;nbsp;this;&amp;nbsp;//&amp;nbsp;keep&amp;nbsp;scale&amp;nbsp;as-is&amp;nbsp;(Java&amp;nbsp;keeps&amp;nbsp;representation)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;v&amp;nbsp;=&amp;nbsp;this.intVal;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;s&amp;nbsp;=&amp;nbsp;this.scale;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(s&amp;nbsp;&amp;gt;&amp;nbsp;0&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;(v&amp;nbsp;%&amp;nbsp;10n)&amp;nbsp;===&amp;nbsp;0n)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v&amp;nbsp;/=&amp;nbsp;10n;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s&amp;nbsp;-=&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(v&amp;nbsp;===&amp;nbsp;this.intVal&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;s&amp;nbsp;===&amp;nbsp;this.scale)&amp;nbsp;?&amp;nbsp;this&amp;nbsp;:&amp;nbsp;new&amp;nbsp;BigDecimal(v,&amp;nbsp;s);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;比較大小（忽略&amp;nbsp;scale&amp;nbsp;差異；數值相等則回傳&amp;nbsp;0），等同&amp;nbsp;Java&amp;nbsp;compareTo&amp;nbsp;語義。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Compare&amp;nbsp;numerically&amp;nbsp;(ignores&amp;nbsp;scale&amp;nbsp;differences),&amp;nbsp;like&amp;nbsp;Java&amp;nbsp;compareTo.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;compareTo(other:&amp;nbsp;BigDecimal&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint):&amp;nbsp;-1&amp;nbsp;|&amp;nbsp;0&amp;nbsp;|&amp;nbsp;1&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;b&amp;nbsp;=&amp;nbsp;BigDecimal.from(other);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;[aAdj,&amp;nbsp;bAdj]&amp;nbsp;=&amp;nbsp;BigDecimal.alignScales(this,&amp;nbsp;b);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(aAdj&amp;nbsp;&amp;lt;&amp;nbsp;bAdj)&amp;nbsp;return&amp;nbsp;-1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(aAdj&amp;nbsp;&amp;gt;&amp;nbsp;bAdj)&amp;nbsp;return&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;equals（Java&amp;nbsp;語義：數值與&amp;nbsp;scale&amp;nbsp;都必須相同）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;equals&amp;nbsp;(Java&amp;nbsp;semantics:&amp;nbsp;both&amp;nbsp;value&amp;nbsp;AND&amp;nbsp;scale&amp;nbsp;must&amp;nbsp;match).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;equals(other:&amp;nbsp;BigDecimal&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint):&amp;nbsp;boolean&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;b&amp;nbsp;=&amp;nbsp;BigDecimal.from(other);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.scale&amp;nbsp;===&amp;nbsp;b.scale&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;this.intVal&amp;nbsp;===&amp;nbsp;b.intVal;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;只比「數值是否相等」（忽略&amp;nbsp;scale），相當於&amp;nbsp;compareTo(other)&amp;nbsp;===&amp;nbsp;0。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Numeric&amp;nbsp;equality&amp;nbsp;ignoring&amp;nbsp;scale&amp;nbsp;(compareTo(other)&amp;nbsp;===&amp;nbsp;0).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;equalsValue(other:&amp;nbsp;BigDecimal&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint):&amp;nbsp;boolean&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.compareTo(other)&amp;nbsp;===&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;回傳有效位數（precision），與&amp;nbsp;Java&amp;nbsp;BigDecimal.precision&amp;nbsp;類似。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Returns&amp;nbsp;precision&amp;nbsp;(count&amp;nbsp;of&amp;nbsp;significant&amp;nbsp;digits),&amp;nbsp;Java-like.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;precision():&amp;nbsp;number&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Java:&amp;nbsp;precision&amp;nbsp;of&amp;nbsp;0&amp;nbsp;is&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(this.intVal&amp;nbsp;===&amp;nbsp;0n)&amp;nbsp;return&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;abs&amp;nbsp;=&amp;nbsp;this.intVal&amp;nbsp;&amp;lt;&amp;nbsp;0n&amp;nbsp;?&amp;nbsp;-this.intVal&amp;nbsp;:&amp;nbsp;this.intVal;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;NOTE:&amp;nbsp;unscaled&amp;nbsp;value&amp;nbsp;may&amp;nbsp;include&amp;nbsp;trailing&amp;nbsp;zeros;&amp;nbsp;precision&amp;nbsp;counts&amp;nbsp;them&amp;nbsp;too&amp;nbsp;(Java&amp;nbsp;does).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;abs.toString().length;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;以&amp;nbsp;MathContext（precision&amp;nbsp;+&amp;nbsp;rounding）做四捨五入（有效位數）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Round&amp;nbsp;using&amp;nbsp;MathContext&amp;nbsp;(precision&amp;nbsp;+&amp;nbsp;rounding&amp;nbsp;mode).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;round(mc:&amp;nbsp;MathContext):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!mc&amp;nbsp;||&amp;nbsp;!Number.isInteger(mc.precision)&amp;nbsp;||&amp;nbsp;mc.precision&amp;nbsp;&amp;lt;&amp;nbsp;1)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;MathContext.precision&amp;nbsp;must&amp;nbsp;be&amp;nbsp;an&amp;nbsp;integer&amp;nbsp;&amp;gt;=&amp;nbsp;1&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;rm&amp;nbsp;=&amp;nbsp;mc.roundingMode&amp;nbsp;??&amp;nbsp;&amp;quot;HALF_UP&amp;quot;;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;curPrec&amp;nbsp;=&amp;nbsp;this.precision();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(curPrec&amp;nbsp;&amp;lt;=&amp;nbsp;mc.precision)&amp;nbsp;return&amp;nbsp;this;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;drop&amp;nbsp;=&amp;nbsp;curPrec&amp;nbsp;-&amp;nbsp;mc.precision;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;digits&amp;nbsp;to&amp;nbsp;drop&amp;nbsp;from&amp;nbsp;unscaled&amp;nbsp;value
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;divisor&amp;nbsp;=&amp;nbsp;BigDecimal.pow10(drop);&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;10^drop
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;{&amp;nbsp;q,&amp;nbsp;r&amp;nbsp;}&amp;nbsp;=&amp;nbsp;BigDecimal.divmodPosDenom(this.intVal,&amp;nbsp;divisor);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;roundedQ&amp;nbsp;=&amp;nbsp;BigDecimal.roundQuotient(q,&amp;nbsp;r,&amp;nbsp;divisor,&amp;nbsp;this.intVal,&amp;nbsp;rm);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;scale&amp;nbsp;decreases&amp;nbsp;by&amp;nbsp;drop;&amp;nbsp;if&amp;nbsp;becomes&amp;nbsp;negative,&amp;nbsp;convert&amp;nbsp;to&amp;nbsp;scale=0&amp;nbsp;by&amp;nbsp;shifting&amp;nbsp;left.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;newScale&amp;nbsp;=&amp;nbsp;this.scale&amp;nbsp;-&amp;nbsp;drop;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;newIntVal&amp;nbsp;=&amp;nbsp;roundedQ;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(newScale&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newIntVal&amp;nbsp;=&amp;nbsp;newIntVal&amp;nbsp;*&amp;nbsp;BigDecimal.pow10(-newScale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newScale&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;new&amp;nbsp;BigDecimal(newIntVal,&amp;nbsp;newScale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;小數點左移&amp;nbsp;n&amp;nbsp;位（相當於&amp;nbsp;/&amp;nbsp;10^n）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Move&amp;nbsp;decimal&amp;nbsp;point&amp;nbsp;left&amp;nbsp;by&amp;nbsp;n&amp;nbsp;(equivalent&amp;nbsp;to&amp;nbsp;/&amp;nbsp;10^n).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;movePointLeft(n:&amp;nbsp;number):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!Number.isInteger(n))&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;n&amp;nbsp;must&amp;nbsp;be&amp;nbsp;an&amp;nbsp;integer&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(n&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;this;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(n&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;this.movePointRight(-n);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;new&amp;nbsp;BigDecimal(this.intVal,&amp;nbsp;this.scale&amp;nbsp;+&amp;nbsp;n);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;小數點右移&amp;nbsp;n&amp;nbsp;位（相當於&amp;nbsp;*&amp;nbsp;10^n）；若&amp;nbsp;scale&amp;nbsp;變成負數會自動轉為&amp;nbsp;scale=0&amp;nbsp;並擴大&amp;nbsp;intVal。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Move&amp;nbsp;decimal&amp;nbsp;point&amp;nbsp;right&amp;nbsp;by&amp;nbsp;n&amp;nbsp;(equivalent&amp;nbsp;to&amp;nbsp;*&amp;nbsp;10^n).&amp;nbsp;If&amp;nbsp;scale&amp;nbsp;becomes&amp;nbsp;negative,&amp;nbsp;it&amp;nbsp;is&amp;nbsp;normalized&amp;nbsp;to&amp;nbsp;scale=0&amp;nbsp;by&amp;nbsp;expanding&amp;nbsp;intVal.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;movePointRight(n:&amp;nbsp;number):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!Number.isInteger(n))&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;n&amp;nbsp;must&amp;nbsp;be&amp;nbsp;an&amp;nbsp;integer&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(n&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;this;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(n&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;this.movePointLeft(-n);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;newScale&amp;nbsp;=&amp;nbsp;this.scale&amp;nbsp;-&amp;nbsp;n;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(newScale&amp;nbsp;&amp;gt;=&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;new&amp;nbsp;BigDecimal(this.intVal,&amp;nbsp;newScale);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;scale&amp;nbsp;would&amp;nbsp;be&amp;nbsp;negative&amp;nbsp;-&amp;gt;&amp;nbsp;shift&amp;nbsp;intVal&amp;nbsp;and&amp;nbsp;set&amp;nbsp;scale=0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;factor&amp;nbsp;=&amp;nbsp;BigDecimal.pow10(-newScale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;new&amp;nbsp;BigDecimal(this.intVal&amp;nbsp;*&amp;nbsp;factor,&amp;nbsp;0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;輸出「一般十進位字串」（不使用科學記號）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Plain&amp;nbsp;decimal&amp;nbsp;string&amp;nbsp;(no&amp;nbsp;scientific&amp;nbsp;notation).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;toPlainString():&amp;nbsp;string&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;sign&amp;nbsp;=&amp;nbsp;this.intVal&amp;nbsp;&amp;lt;&amp;nbsp;0n&amp;nbsp;?&amp;nbsp;&amp;quot;-&amp;quot;&amp;nbsp;:&amp;nbsp;&amp;quot;&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;abs&amp;nbsp;=&amp;nbsp;this.intVal&amp;nbsp;&amp;lt;&amp;nbsp;0n&amp;nbsp;?&amp;nbsp;-this.intVal&amp;nbsp;:&amp;nbsp;this.intVal;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(this.scale&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;sign&amp;nbsp;+&amp;nbsp;abs.toString();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;s&amp;nbsp;=&amp;nbsp;abs.toString();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;pointPos&amp;nbsp;=&amp;nbsp;s.length&amp;nbsp;-&amp;nbsp;this.scale;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(pointPos&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;intPart&amp;nbsp;=&amp;nbsp;s.slice(0,&amp;nbsp;pointPos);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;fracPart&amp;nbsp;=&amp;nbsp;s.slice(pointPos);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;sign&amp;nbsp;+&amp;nbsp;intPart&amp;nbsp;+&amp;nbsp;&amp;quot;.&amp;quot;&amp;nbsp;+&amp;nbsp;fracPart;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;zeros&amp;nbsp;=&amp;nbsp;&amp;quot;0&amp;quot;.repeat(-pointPos);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;sign&amp;nbsp;+&amp;nbsp;&amp;quot;0.&amp;quot;&amp;nbsp;+&amp;nbsp;zeros&amp;nbsp;+&amp;nbsp;s;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;toString（此實作等同&amp;nbsp;toPlainString，避免出現科學記號）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;toString&amp;nbsp;(this&amp;nbsp;implementation&amp;nbsp;equals&amp;nbsp;toPlainString&amp;nbsp;to&amp;nbsp;avoid&amp;nbsp;scientific&amp;nbsp;notation).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;toString():&amp;nbsp;string&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.toPlainString();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;嘗試轉成&amp;nbsp;number（可能失去精度，不建議用於財務/精準計算）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Convert&amp;nbsp;to&amp;nbsp;number&amp;nbsp;(may&amp;nbsp;lose&amp;nbsp;precision;&amp;nbsp;not&amp;nbsp;recommended&amp;nbsp;for&amp;nbsp;money/precise&amp;nbsp;math).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;toNumber():&amp;nbsp;number&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;Number(this.toPlainString());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;--------------------&amp;nbsp;private&amp;nbsp;core&amp;nbsp;division&amp;nbsp;helpers&amp;nbsp;--------------------

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;精確除法；若除不盡（無限小數），會拋錯。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Exact&amp;nbsp;division;&amp;nbsp;throws&amp;nbsp;if&amp;nbsp;the&amp;nbsp;decimal&amp;nbsp;expansion&amp;nbsp;is&amp;nbsp;non-terminating.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;divideExact(divisor:&amp;nbsp;BigDecimal):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Build&amp;nbsp;fraction:&amp;nbsp;value&amp;nbsp;=&amp;nbsp;(A&amp;nbsp;*&amp;nbsp;10^(sb-sa))&amp;nbsp;/&amp;nbsp;B
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;num&amp;nbsp;=&amp;nbsp;this.intVal;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;den&amp;nbsp;=&amp;nbsp;divisor.intVal;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;adjust&amp;nbsp;by&amp;nbsp;exponent&amp;nbsp;=&amp;nbsp;sb&amp;nbsp;-&amp;nbsp;sa
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;exp&amp;nbsp;=&amp;nbsp;divisor.scale&amp;nbsp;-&amp;nbsp;this.scale;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(exp&amp;nbsp;&amp;gt;=&amp;nbsp;0)&amp;nbsp;num&amp;nbsp;=&amp;nbsp;num&amp;nbsp;*&amp;nbsp;BigDecimal.pow10(exp);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;den&amp;nbsp;=&amp;nbsp;den&amp;nbsp;*&amp;nbsp;BigDecimal.pow10(-exp);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;normalize&amp;nbsp;denominator&amp;nbsp;to&amp;nbsp;positive
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(den&amp;nbsp;&amp;lt;&amp;nbsp;0n)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;den&amp;nbsp;=&amp;nbsp;-den;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num&amp;nbsp;=&amp;nbsp;-num;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;reduce&amp;nbsp;fraction
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;g&amp;nbsp;=&amp;nbsp;BigDecimal.gcd(BigDecimal.absBigInt(num),&amp;nbsp;den);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num&amp;nbsp;/=&amp;nbsp;g;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;den&amp;nbsp;/=&amp;nbsp;g;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;den&amp;nbsp;must&amp;nbsp;be&amp;nbsp;2^a&amp;nbsp;*&amp;nbsp;5^b&amp;nbsp;for&amp;nbsp;terminating&amp;nbsp;decimal
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;d&amp;nbsp;=&amp;nbsp;den;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;p2&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;p5&amp;nbsp;=&amp;nbsp;0;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(d&amp;nbsp;%&amp;nbsp;2n&amp;nbsp;===&amp;nbsp;0n)&amp;nbsp;{&amp;nbsp;d&amp;nbsp;/=&amp;nbsp;2n;&amp;nbsp;p2++;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(d&amp;nbsp;%&amp;nbsp;5n&amp;nbsp;===&amp;nbsp;0n)&amp;nbsp;{&amp;nbsp;d&amp;nbsp;/=&amp;nbsp;5n;&amp;nbsp;p5++;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(d&amp;nbsp;!==&amp;nbsp;1n)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;Non-terminating&amp;nbsp;decimal&amp;nbsp;expansion;&amp;nbsp;specify&amp;nbsp;scale&amp;nbsp;and&amp;nbsp;rounding&amp;nbsp;mode&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;s&amp;nbsp;=&amp;nbsp;Math.max(p2,&amp;nbsp;p5);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;intVal&amp;nbsp;=&amp;nbsp;num&amp;nbsp;*&amp;nbsp;10^s&amp;nbsp;/&amp;nbsp;den&amp;nbsp;=&amp;nbsp;num&amp;nbsp;*&amp;nbsp;2^(s-p2)&amp;nbsp;*&amp;nbsp;5^(s-p5)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;mul2&amp;nbsp;=&amp;nbsp;BigDecimal.powBigInt(2n,&amp;nbsp;s&amp;nbsp;-&amp;nbsp;p2);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;mul5&amp;nbsp;=&amp;nbsp;BigDecimal.powBigInt(5n,&amp;nbsp;s&amp;nbsp;-&amp;nbsp;p5);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;intVal&amp;nbsp;=&amp;nbsp;num&amp;nbsp;*&amp;nbsp;mul2&amp;nbsp;*&amp;nbsp;mul5;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;new&amp;nbsp;BigDecimal(intVal,&amp;nbsp;s);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;指定結果小數位（scale）與捨入模式的除法。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Division&amp;nbsp;with&amp;nbsp;specified&amp;nbsp;result&amp;nbsp;scale&amp;nbsp;and&amp;nbsp;rounding&amp;nbsp;mode.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;divideScaled(divisor:&amp;nbsp;BigDecimal,&amp;nbsp;resultScale:&amp;nbsp;number,&amp;nbsp;rounding:&amp;nbsp;RoundingMode):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!Number.isInteger(resultScale)&amp;nbsp;||&amp;nbsp;resultScale&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;resultScale&amp;nbsp;must&amp;nbsp;be&amp;nbsp;a&amp;nbsp;non-negative&amp;nbsp;integer&amp;quot;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Compute&amp;nbsp;q&amp;nbsp;=&amp;nbsp;round(&amp;nbsp;numerator&amp;nbsp;/&amp;nbsp;denominator&amp;nbsp;)&amp;nbsp;where&amp;nbsp;result&amp;nbsp;has&amp;nbsp;`resultScale`.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;exp&amp;nbsp;=&amp;nbsp;resultScale&amp;nbsp;+&amp;nbsp;sb&amp;nbsp;-&amp;nbsp;sa
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;exp&amp;nbsp;=&amp;nbsp;resultScale&amp;nbsp;+&amp;nbsp;divisor.scale&amp;nbsp;-&amp;nbsp;this.scale;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;numerator:&amp;nbsp;bigint;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;denominator:&amp;nbsp;bigint;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(exp&amp;nbsp;&amp;gt;=&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;numerator&amp;nbsp;=&amp;nbsp;this.intVal&amp;nbsp;*&amp;nbsp;BigDecimal.pow10(exp);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;denominator&amp;nbsp;=&amp;nbsp;divisor.intVal;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;numerator&amp;nbsp;=&amp;nbsp;this.intVal;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;denominator&amp;nbsp;=&amp;nbsp;divisor.intVal&amp;nbsp;*&amp;nbsp;BigDecimal.pow10(-exp);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;normalize&amp;nbsp;denominator&amp;nbsp;to&amp;nbsp;positive
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(denominator&amp;nbsp;&amp;lt;&amp;nbsp;0n)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;denominator&amp;nbsp;=&amp;nbsp;-denominator;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;numerator&amp;nbsp;=&amp;nbsp;-numerator;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;{&amp;nbsp;q,&amp;nbsp;r&amp;nbsp;}&amp;nbsp;=&amp;nbsp;BigDecimal.divmodPosDenom(numerator,&amp;nbsp;denominator);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;roundedQ&amp;nbsp;=&amp;nbsp;BigDecimal.roundQuotient(q,&amp;nbsp;r,&amp;nbsp;denominator,&amp;nbsp;numerator,&amp;nbsp;rounding);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;new&amp;nbsp;BigDecimal(roundedQ,&amp;nbsp;resultScale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;--------------------&amp;nbsp;private&amp;nbsp;parsing&amp;nbsp;&amp;amp;&amp;nbsp;math&amp;nbsp;helpers&amp;nbsp;--------------------

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;解析十進位字串（支援科學記號&amp;nbsp;e/E）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Parse&amp;nbsp;decimal&amp;nbsp;string&amp;nbsp;(supports&amp;nbsp;scientific&amp;nbsp;notation&amp;nbsp;e/E).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;parseDecimalString(input:&amp;nbsp;string):&amp;nbsp;{&amp;nbsp;intVal:&amp;nbsp;bigint;&amp;nbsp;scale:&amp;nbsp;number&amp;nbsp;}&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;str&amp;nbsp;=&amp;nbsp;input.trim();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!str)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;Empty&amp;nbsp;decimal&amp;quot;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Allow:&amp;nbsp;[+|-]?&amp;nbsp;(digits?&amp;nbsp;&amp;quot;.&amp;quot;&amp;nbsp;digits?&amp;nbsp;|&amp;nbsp;digits&amp;nbsp;&amp;quot;.&amp;quot;)&amp;nbsp;(&amp;nbsp;[eE][+|-]?digits&amp;nbsp;)?
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;m&amp;nbsp;=&amp;nbsp;/^([+-])?(?:(\d+)?(?:\.(\d*)?)?|\.(\d+))(?:[eE]([+-]?\d+))?$/.exec(str);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!m)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(`Invalid&amp;nbsp;decimal&amp;nbsp;string:&amp;nbsp;${input}`);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;sign&amp;nbsp;=&amp;nbsp;m[1]&amp;nbsp;===&amp;nbsp;&amp;quot;-&amp;quot;&amp;nbsp;?&amp;nbsp;-1n&amp;nbsp;:&amp;nbsp;1n;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Two&amp;nbsp;possible&amp;nbsp;captures:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;-&amp;nbsp;m[2]&amp;nbsp;digits&amp;nbsp;before&amp;nbsp;dot&amp;nbsp;(optional)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;-&amp;nbsp;m[3]&amp;nbsp;digits&amp;nbsp;after&amp;nbsp;dot&amp;nbsp;(optional,&amp;nbsp;can&amp;nbsp;be&amp;nbsp;empty&amp;nbsp;when&amp;nbsp;&amp;quot;12.&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;-&amp;nbsp;or&amp;nbsp;m[4]&amp;nbsp;digits&amp;nbsp;after&amp;nbsp;dot&amp;nbsp;when&amp;nbsp;string&amp;nbsp;starts&amp;nbsp;with&amp;nbsp;&amp;quot;.&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;intPart&amp;nbsp;=&amp;nbsp;(m[2]&amp;nbsp;??&amp;nbsp;&amp;quot;&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;fracPart&amp;nbsp;=&amp;nbsp;(m[4]&amp;nbsp;??&amp;nbsp;m[3]&amp;nbsp;??&amp;nbsp;&amp;quot;&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;expStr&amp;nbsp;=&amp;nbsp;m[5]&amp;nbsp;??&amp;nbsp;&amp;quot;0&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;exp&amp;nbsp;=&amp;nbsp;Number(expStr);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!Number.isInteger(exp))&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(`Invalid&amp;nbsp;exponent:&amp;nbsp;${expStr}`);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Digits&amp;nbsp;without&amp;nbsp;dot
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;digits&amp;nbsp;=&amp;nbsp;(intPart&amp;nbsp;+&amp;nbsp;fracPart);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;remove&amp;nbsp;leading&amp;nbsp;zeros&amp;nbsp;for&amp;nbsp;BigInt&amp;nbsp;parsing&amp;nbsp;(keep&amp;nbsp;at&amp;nbsp;least&amp;nbsp;one&amp;nbsp;digit&amp;nbsp;if&amp;nbsp;all&amp;nbsp;zeros)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;digits&amp;nbsp;=&amp;nbsp;digits.replace(/^0+(?=\d)/,&amp;nbsp;&amp;quot;&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(digits&amp;nbsp;===&amp;nbsp;&amp;quot;&amp;quot;)&amp;nbsp;digits&amp;nbsp;=&amp;nbsp;&amp;quot;0&amp;quot;;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;scale&amp;nbsp;=&amp;nbsp;fracLen&amp;nbsp;-&amp;nbsp;exp&amp;nbsp;&amp;nbsp;(moving&amp;nbsp;decimal&amp;nbsp;right&amp;nbsp;by&amp;nbsp;exp&amp;nbsp;reduces&amp;nbsp;scale)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;scale&amp;nbsp;=&amp;nbsp;fracPart.length&amp;nbsp;-&amp;nbsp;exp;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;intVal&amp;nbsp;=&amp;nbsp;BigInt(digits)&amp;nbsp;*&amp;nbsp;sign;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(intVal&amp;nbsp;===&amp;nbsp;0n)&amp;nbsp;intVal&amp;nbsp;=&amp;nbsp;0n;&amp;nbsp;//&amp;nbsp;avoid&amp;nbsp;-0

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(scale&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;shift&amp;nbsp;left&amp;nbsp;if&amp;nbsp;scale&amp;nbsp;would&amp;nbsp;be&amp;nbsp;negative
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intVal&amp;nbsp;=&amp;nbsp;intVal&amp;nbsp;*&amp;nbsp;BigDecimal.pow10(-scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scale&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!Number.isInteger(scale)&amp;nbsp;||&amp;nbsp;scale&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;Invalid&amp;nbsp;scale&amp;nbsp;after&amp;nbsp;parsing&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;nbsp;intVal,&amp;nbsp;scale&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;將兩個&amp;nbsp;BigDecimal&amp;nbsp;對齊到相同&amp;nbsp;scale（用於加減比大小）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Align&amp;nbsp;scales&amp;nbsp;of&amp;nbsp;two&amp;nbsp;BigDecimals&amp;nbsp;(used&amp;nbsp;for&amp;nbsp;add/sub/compare).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;alignScales(a:&amp;nbsp;BigDecimal,&amp;nbsp;b:&amp;nbsp;BigDecimal):&amp;nbsp;[bigint,&amp;nbsp;bigint,&amp;nbsp;number]&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;s&amp;nbsp;=&amp;nbsp;Math.max(a.scale,&amp;nbsp;b.scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;aFactor&amp;nbsp;=&amp;nbsp;BigDecimal.pow10(s&amp;nbsp;-&amp;nbsp;a.scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;bFactor&amp;nbsp;=&amp;nbsp;BigDecimal.pow10(s&amp;nbsp;-&amp;nbsp;b.scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;[a.intVal&amp;nbsp;*&amp;nbsp;aFactor,&amp;nbsp;b.intVal&amp;nbsp;*&amp;nbsp;bFactor,&amp;nbsp;s];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;10&amp;nbsp;的&amp;nbsp;n&amp;nbsp;次方（BigInt）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;10^n&amp;nbsp;as&amp;nbsp;BigInt.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;pow10(n:&amp;nbsp;number):&amp;nbsp;bigint&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!Number.isInteger(n)&amp;nbsp;||&amp;nbsp;n&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;pow10&amp;nbsp;expects&amp;nbsp;non-negative&amp;nbsp;integer&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.powBigInt(10n,&amp;nbsp;n);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;base&amp;nbsp;的&amp;nbsp;exp&amp;nbsp;次方（BigInt，快速冪）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;base^exp&amp;nbsp;using&amp;nbsp;fast&amp;nbsp;exponentiation&amp;nbsp;(BigInt).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;powBigInt(base:&amp;nbsp;bigint,&amp;nbsp;exp:&amp;nbsp;number):&amp;nbsp;bigint&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!Number.isInteger(exp)&amp;nbsp;||&amp;nbsp;exp&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;powBigInt&amp;nbsp;exp&amp;nbsp;must&amp;nbsp;be&amp;nbsp;non-negative&amp;nbsp;integer&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;r&amp;nbsp;=&amp;nbsp;1n;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;b&amp;nbsp;=&amp;nbsp;base;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;e&amp;nbsp;=&amp;nbsp;exp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(e&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(e&amp;nbsp;&amp;amp;&amp;nbsp;1)&amp;nbsp;r&amp;nbsp;*=&amp;nbsp;b;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;*=&amp;nbsp;b;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e&amp;nbsp;&amp;gt;&amp;gt;=&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;r;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;BigInt&amp;nbsp;絕對值。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;BigInt&amp;nbsp;absolute&amp;nbsp;value.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;absBigInt(x:&amp;nbsp;bigint):&amp;nbsp;bigint&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;x&amp;nbsp;&amp;lt;&amp;nbsp;0n&amp;nbsp;?&amp;nbsp;-x&amp;nbsp;:&amp;nbsp;x;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;最大公因數&amp;nbsp;gcd（BigInt）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Greatest&amp;nbsp;common&amp;nbsp;divisor&amp;nbsp;(BigInt).
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;gcd(a:&amp;nbsp;bigint,&amp;nbsp;b:&amp;nbsp;bigint):&amp;nbsp;bigint&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;x&amp;nbsp;=&amp;nbsp;a;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;y&amp;nbsp;=&amp;nbsp;b;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(y&amp;nbsp;!==&amp;nbsp;0n)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;t&amp;nbsp;=&amp;nbsp;x&amp;nbsp;%&amp;nbsp;y;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x&amp;nbsp;=&amp;nbsp;y;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y&amp;nbsp;=&amp;nbsp;t;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;x;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;BigInt&amp;nbsp;除法與餘數（保證除數為正數）。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;divmod&amp;nbsp;with&amp;nbsp;positive&amp;nbsp;denominator.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;divmodPosDenom(numer:&amp;nbsp;bigint,&amp;nbsp;denomPos:&amp;nbsp;bigint):&amp;nbsp;{&amp;nbsp;q:&amp;nbsp;bigint;&amp;nbsp;r:&amp;nbsp;bigint&amp;nbsp;}&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(denomPos&amp;nbsp;&amp;lt;=&amp;nbsp;0n)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;denominator&amp;nbsp;must&amp;nbsp;be&amp;nbsp;positive&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;q&amp;nbsp;=&amp;nbsp;numer&amp;nbsp;/&amp;nbsp;denomPos;&amp;nbsp;//&amp;nbsp;trunc&amp;nbsp;toward&amp;nbsp;zero
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;r&amp;nbsp;=&amp;nbsp;numer&amp;nbsp;%&amp;nbsp;denomPos;&amp;nbsp;//&amp;nbsp;same&amp;nbsp;sign&amp;nbsp;as&amp;nbsp;numer
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;nbsp;q,&amp;nbsp;r&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;依照捨入模式把&amp;nbsp;q&amp;nbsp;+&amp;nbsp;r/denom&amp;nbsp;進行捨入，denom&amp;nbsp;必須為正。
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;Round&amp;nbsp;quotient&amp;nbsp;for&amp;nbsp;q&amp;nbsp;+&amp;nbsp;r/denom&amp;nbsp;using&amp;nbsp;rounding&amp;nbsp;mode;&amp;nbsp;denom&amp;nbsp;must&amp;nbsp;be&amp;nbsp;positive.
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;roundQuotient(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;q:&amp;nbsp;bigint,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;r:&amp;nbsp;bigint,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;denomPos:&amp;nbsp;bigint,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;numer:&amp;nbsp;bigint,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mode:&amp;nbsp;RoundingMode
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;):&amp;nbsp;bigint&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(r&amp;nbsp;===&amp;nbsp;0n)&amp;nbsp;return&amp;nbsp;q;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(denomPos&amp;nbsp;&amp;lt;=&amp;nbsp;0n)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;denominator&amp;nbsp;must&amp;nbsp;be&amp;nbsp;positive&amp;quot;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;sign&amp;nbsp;=&amp;nbsp;numer&amp;nbsp;&amp;lt;&amp;nbsp;0n&amp;nbsp;?&amp;nbsp;-1n&amp;nbsp;:&amp;nbsp;1n;&amp;nbsp;//&amp;nbsp;sign&amp;nbsp;of&amp;nbsp;exact&amp;nbsp;value&amp;nbsp;since&amp;nbsp;denom&amp;nbsp;&amp;gt;&amp;nbsp;0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;awayFromZero&amp;nbsp;=&amp;nbsp;(x:&amp;nbsp;bigint)&amp;nbsp;=&amp;gt;&amp;nbsp;(sign&amp;nbsp;&amp;gt;=&amp;nbsp;0n&amp;nbsp;?&amp;nbsp;x&amp;nbsp;+&amp;nbsp;1n&amp;nbsp;:&amp;nbsp;x&amp;nbsp;-&amp;nbsp;1n);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch&amp;nbsp;(mode)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&amp;quot;DOWN&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;toward&amp;nbsp;zero
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;q;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&amp;quot;UP&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;away&amp;nbsp;from&amp;nbsp;zero
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;awayFromZero(q);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&amp;quot;FLOOR&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;toward&amp;nbsp;-∞
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(numer&amp;nbsp;&amp;lt;&amp;nbsp;0n)&amp;nbsp;?&amp;nbsp;(q&amp;nbsp;-&amp;nbsp;1n)&amp;nbsp;:&amp;nbsp;q;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&amp;quot;CEILING&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;toward&amp;nbsp;+∞
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(numer&amp;nbsp;&amp;gt;&amp;nbsp;0n)&amp;nbsp;?&amp;nbsp;(q&amp;nbsp;+&amp;nbsp;1n)&amp;nbsp;:&amp;nbsp;q;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&amp;quot;HALF_UP&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&amp;quot;HALF_DOWN&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&amp;quot;HALF_EVEN&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;rAbs&amp;nbsp;=&amp;nbsp;BigDecimal.absBigInt(r);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;twiceR&amp;nbsp;=&amp;nbsp;rAbs&amp;nbsp;*&amp;nbsp;2n;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(twiceR&amp;nbsp;&amp;gt;&amp;nbsp;denomPos)&amp;nbsp;return&amp;nbsp;awayFromZero(q);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(twiceR&amp;nbsp;&amp;lt;&amp;nbsp;denomPos)&amp;nbsp;return&amp;nbsp;q;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;exactly&amp;nbsp;half
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(mode&amp;nbsp;===&amp;nbsp;&amp;quot;HALF_UP&amp;quot;)&amp;nbsp;return&amp;nbsp;awayFromZero(q);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(mode&amp;nbsp;===&amp;nbsp;&amp;quot;HALF_DOWN&amp;quot;)&amp;nbsp;return&amp;nbsp;q;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;HALF_EVEN:&amp;nbsp;round&amp;nbsp;to&amp;nbsp;make&amp;nbsp;result&amp;nbsp;even
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;isOdd&amp;nbsp;=&amp;nbsp;(q&amp;nbsp;&amp;amp;&amp;nbsp;1n)&amp;nbsp;!==&amp;nbsp;0n;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;isOdd&amp;nbsp;?&amp;nbsp;awayFromZero(q)&amp;nbsp;:&amp;nbsp;q;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;_never:&amp;nbsp;never&amp;nbsp;=&amp;nbsp;mode;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;q;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;h2&gt;使用方法（由于JavaScript 精度问题，请直接把数字转为字符串）：&lt;/h2&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;const&amp;nbsp;a&amp;nbsp;=&amp;nbsp;new&amp;nbsp;BigDecimal(&amp;quot;0.1&amp;quot;);
const&amp;nbsp;b&amp;nbsp;=&amp;nbsp;new&amp;nbsp;BigDecimal(&amp;quot;0.2&amp;quot;);
console.log(a.add(b).toString());&amp;nbsp;//&amp;nbsp;0.3

console.log(new&amp;nbsp;BigDecimal(&amp;quot;1&amp;quot;).divide(&amp;quot;3&amp;quot;,&amp;nbsp;10,&amp;nbsp;&amp;quot;HALF_UP&amp;quot;).toString());&amp;nbsp;//&amp;nbsp;0.3333333333

console.log(new&amp;nbsp;BigDecimal(&amp;quot;1&amp;quot;).divide(&amp;quot;8&amp;quot;).toString());&amp;nbsp;//&amp;nbsp;0.125（精确可除）
try&amp;nbsp;{
&amp;nbsp;&amp;nbsp;console.log(new&amp;nbsp;BigDecimal(&amp;quot;1&amp;quot;).divide(&amp;quot;3&amp;quot;).toString());&amp;nbsp;//&amp;nbsp;无限小数会报错
}&amp;nbsp;catch&amp;nbsp;(e)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;console.log(String(e));
}

console.log(new&amp;nbsp;BigDecimal(&amp;quot;1.2300&amp;quot;).stripTrailingZeros().toString());&amp;nbsp;//&amp;nbsp;1.23
console.log(new&amp;nbsp;BigDecimal(&amp;quot;1.2300&amp;quot;).equals(new&amp;nbsp;BigDecimal(&amp;quot;1.23&amp;quot;)));&amp;nbsp;//&amp;nbsp;false（Java&amp;nbsp;equals）
console.log(new&amp;nbsp;BigDecimal(&amp;quot;1.2300&amp;quot;).equalsValue(new&amp;nbsp;BigDecimal(&amp;quot;1.23&amp;quot;)));&amp;nbsp;//&amp;nbsp;true（比较数值）&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;h2&gt;ES2020以下版本兼容（ES2020以下版本不支持 bigint）（AI按照我上面写的跑出来的）&lt;/h2&gt;&lt;pre class=&quot;prism-highlight prism-language-typescript&quot;&gt;/*&amp;nbsp;BigDecimal.ts&amp;nbsp;(Safari&amp;nbsp;13&amp;nbsp;compatible)
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;-&amp;nbsp;No&amp;nbsp;BigInt,&amp;nbsp;no&amp;nbsp;bigint&amp;nbsp;literals.
&amp;nbsp;*&amp;nbsp;-&amp;nbsp;Internal&amp;nbsp;integer&amp;nbsp;is&amp;nbsp;stored&amp;nbsp;as&amp;nbsp;a&amp;nbsp;decimal&amp;nbsp;string&amp;nbsp;(abs&amp;nbsp;digits)&amp;nbsp;+&amp;nbsp;sign&amp;nbsp;+&amp;nbsp;scale.
&amp;nbsp;*&amp;nbsp;-&amp;nbsp;Works&amp;nbsp;in&amp;nbsp;Safari&amp;nbsp;13.
&amp;nbsp;*
&amp;nbsp;*&amp;nbsp;Tradeoff:
&amp;nbsp;*&amp;nbsp;-&amp;nbsp;Slower&amp;nbsp;than&amp;nbsp;BigInt&amp;nbsp;version&amp;nbsp;for&amp;nbsp;very&amp;nbsp;large&amp;nbsp;numbers.
&amp;nbsp;*&amp;nbsp;-&amp;nbsp;unscaledValue()&amp;nbsp;returns&amp;nbsp;string&amp;nbsp;(typed&amp;nbsp;as&amp;nbsp;any&amp;nbsp;for&amp;nbsp;drop-in&amp;nbsp;tolerance).
&amp;nbsp;*/

export&amp;nbsp;type&amp;nbsp;RoundingMode&amp;nbsp;=
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;quot;DOWN&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;toward&amp;nbsp;zero
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;quot;UP&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;away&amp;nbsp;from&amp;nbsp;zero
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;quot;FLOOR&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;toward&amp;nbsp;-∞
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;quot;CEILING&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;toward&amp;nbsp;+∞
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;quot;HALF_UP&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;ties&amp;nbsp;away&amp;nbsp;from&amp;nbsp;zero
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;quot;HALF_DOWN&amp;quot;&amp;nbsp;&amp;nbsp;//&amp;nbsp;ties&amp;nbsp;toward&amp;nbsp;zero
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;quot;HALF_EVEN&amp;quot;;&amp;nbsp;//&amp;nbsp;banker&amp;#39;s&amp;nbsp;rounding

export&amp;nbsp;interface&amp;nbsp;MathContext&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;precision:&amp;nbsp;number;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;roundingMode:&amp;nbsp;RoundingMode;
}

type&amp;nbsp;Sign&amp;nbsp;=&amp;nbsp;-1&amp;nbsp;|&amp;nbsp;0&amp;nbsp;|&amp;nbsp;1;

function&amp;nbsp;isInt(n:&amp;nbsp;number):&amp;nbsp;boolean&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;typeof&amp;nbsp;n&amp;nbsp;===&amp;nbsp;&amp;quot;number&amp;quot;&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;isFinite(n)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;Math.floor(n)&amp;nbsp;===&amp;nbsp;n;
}

function&amp;nbsp;stripLeadingZeros(d:&amp;nbsp;string):&amp;nbsp;string&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;keep&amp;nbsp;at&amp;nbsp;least&amp;nbsp;one&amp;nbsp;digit
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d&amp;nbsp;=&amp;nbsp;d.replace(/^0+(?=\d)/,&amp;nbsp;&amp;quot;&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;d&amp;nbsp;===&amp;nbsp;&amp;quot;&amp;quot;&amp;nbsp;?&amp;nbsp;&amp;quot;0&amp;quot;&amp;nbsp;:&amp;nbsp;d;
}

function&amp;nbsp;isZeroDigits(d:&amp;nbsp;string):&amp;nbsp;boolean&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;d&amp;nbsp;===&amp;nbsp;&amp;quot;0&amp;quot;;
}

function&amp;nbsp;cmpAbs(a:&amp;nbsp;string,&amp;nbsp;b:&amp;nbsp;string):&amp;nbsp;-1&amp;nbsp;|&amp;nbsp;0&amp;nbsp;|&amp;nbsp;1&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a&amp;nbsp;=&amp;nbsp;stripLeadingZeros(a);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;stripLeadingZeros(b);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(a.length&amp;nbsp;&amp;lt;&amp;nbsp;b.length)&amp;nbsp;return&amp;nbsp;-1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(a.length&amp;nbsp;&amp;gt;&amp;nbsp;b.length)&amp;nbsp;return&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(a&amp;nbsp;===&amp;nbsp;b)&amp;nbsp;return&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;a&amp;nbsp;&amp;lt;&amp;nbsp;b&amp;nbsp;?&amp;nbsp;-1&amp;nbsp;:&amp;nbsp;1;&amp;nbsp;//&amp;nbsp;lexicographic&amp;nbsp;works&amp;nbsp;for&amp;nbsp;same&amp;nbsp;length&amp;nbsp;digits
}

function&amp;nbsp;addAbs(a:&amp;nbsp;string,&amp;nbsp;b:&amp;nbsp;string):&amp;nbsp;string&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;i&amp;nbsp;=&amp;nbsp;a.length&amp;nbsp;-&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;j&amp;nbsp;=&amp;nbsp;b.length&amp;nbsp;-&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;carry&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;out:&amp;nbsp;number[]&amp;nbsp;=&amp;nbsp;[];

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(i&amp;nbsp;&amp;gt;=&amp;nbsp;0&amp;nbsp;||&amp;nbsp;j&amp;nbsp;&amp;gt;=&amp;nbsp;0&amp;nbsp;||&amp;nbsp;carry)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;da&amp;nbsp;=&amp;nbsp;i&amp;nbsp;&amp;gt;=&amp;nbsp;0&amp;nbsp;?&amp;nbsp;(a.charCodeAt(i)&amp;nbsp;-&amp;nbsp;48)&amp;nbsp;:&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;db&amp;nbsp;=&amp;nbsp;j&amp;nbsp;&amp;gt;=&amp;nbsp;0&amp;nbsp;?&amp;nbsp;(b.charCodeAt(j)&amp;nbsp;-&amp;nbsp;48)&amp;nbsp;:&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;s&amp;nbsp;=&amp;nbsp;da&amp;nbsp;+&amp;nbsp;db&amp;nbsp;+&amp;nbsp;carry;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.push(s&amp;nbsp;%&amp;nbsp;10);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;carry&amp;nbsp;=&amp;nbsp;Math.floor(s&amp;nbsp;/&amp;nbsp;10);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i--;&amp;nbsp;j--;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.reverse();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;stripLeadingZeros(out.join(&amp;quot;&amp;quot;));
}

function&amp;nbsp;subAbs(a:&amp;nbsp;string,&amp;nbsp;b:&amp;nbsp;string):&amp;nbsp;string&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;assumes&amp;nbsp;a&amp;nbsp;&amp;gt;=&amp;nbsp;b&amp;nbsp;(abs)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;i&amp;nbsp;=&amp;nbsp;a.length&amp;nbsp;-&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;j&amp;nbsp;=&amp;nbsp;b.length&amp;nbsp;-&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;borrow&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;out:&amp;nbsp;number[]&amp;nbsp;=&amp;nbsp;[];

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(i&amp;nbsp;&amp;gt;=&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;da&amp;nbsp;=&amp;nbsp;(a.charCodeAt(i)&amp;nbsp;-&amp;nbsp;48)&amp;nbsp;-&amp;nbsp;borrow;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;db&amp;nbsp;=&amp;nbsp;j&amp;nbsp;&amp;gt;=&amp;nbsp;0&amp;nbsp;?&amp;nbsp;(b.charCodeAt(j)&amp;nbsp;-&amp;nbsp;48)&amp;nbsp;:&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(da&amp;nbsp;&amp;lt;&amp;nbsp;db)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;da&amp;nbsp;+=&amp;nbsp;10;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;borrow&amp;nbsp;=&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;borrow&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.push(da&amp;nbsp;-&amp;nbsp;db);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i--;&amp;nbsp;j--;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.reverse();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;stripLeadingZeros(out.join(&amp;quot;&amp;quot;));
}

function&amp;nbsp;mulAbs(a:&amp;nbsp;string,&amp;nbsp;b:&amp;nbsp;string):&amp;nbsp;string&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a&amp;nbsp;=&amp;nbsp;stripLeadingZeros(a);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;stripLeadingZeros(b);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(a&amp;nbsp;===&amp;nbsp;&amp;quot;0&amp;quot;&amp;nbsp;||&amp;nbsp;b&amp;nbsp;===&amp;nbsp;&amp;quot;0&amp;quot;)&amp;nbsp;return&amp;nbsp;&amp;quot;0&amp;quot;;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;al&amp;nbsp;=&amp;nbsp;a.length;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;bl&amp;nbsp;=&amp;nbsp;b.length;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;res&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Array(al&amp;nbsp;+&amp;nbsp;bl).fill(0);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(let&amp;nbsp;i&amp;nbsp;=&amp;nbsp;al&amp;nbsp;-&amp;nbsp;1;&amp;nbsp;i&amp;nbsp;&amp;gt;=&amp;nbsp;0;&amp;nbsp;i--)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;da&amp;nbsp;=&amp;nbsp;a.charCodeAt(i)&amp;nbsp;-&amp;nbsp;48;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(let&amp;nbsp;j&amp;nbsp;=&amp;nbsp;bl&amp;nbsp;-&amp;nbsp;1;&amp;nbsp;j&amp;nbsp;&amp;gt;=&amp;nbsp;0;&amp;nbsp;j--)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;db&amp;nbsp;=&amp;nbsp;b.charCodeAt(j)&amp;nbsp;-&amp;nbsp;48;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;idx&amp;nbsp;=&amp;nbsp;i&amp;nbsp;+&amp;nbsp;j&amp;nbsp;+&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res[idx]&amp;nbsp;+=&amp;nbsp;da&amp;nbsp;*&amp;nbsp;db;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;carry
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(let&amp;nbsp;k&amp;nbsp;=&amp;nbsp;res.length&amp;nbsp;-&amp;nbsp;1;&amp;nbsp;k&amp;nbsp;&amp;gt;&amp;nbsp;0;&amp;nbsp;k--)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;carry&amp;nbsp;=&amp;nbsp;Math.floor(res[k]&amp;nbsp;/&amp;nbsp;10);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res[k]&amp;nbsp;=&amp;nbsp;res[k]&amp;nbsp;%&amp;nbsp;10;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;res[k&amp;nbsp;-&amp;nbsp;1]&amp;nbsp;+=&amp;nbsp;carry;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;stripLeadingZeros(res.join(&amp;quot;&amp;quot;));
}

function&amp;nbsp;mulSmallAbs(a:&amp;nbsp;string,&amp;nbsp;k:&amp;nbsp;number):&amp;nbsp;string&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a&amp;nbsp;=&amp;nbsp;stripLeadingZeros(a);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(a&amp;nbsp;===&amp;nbsp;&amp;quot;0&amp;quot;&amp;nbsp;||&amp;nbsp;k&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;&amp;quot;0&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(k&amp;nbsp;===&amp;nbsp;1)&amp;nbsp;return&amp;nbsp;a;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;carry&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;out:&amp;nbsp;number[]&amp;nbsp;=&amp;nbsp;[];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(let&amp;nbsp;i&amp;nbsp;=&amp;nbsp;a.length&amp;nbsp;-&amp;nbsp;1;&amp;nbsp;i&amp;nbsp;&amp;gt;=&amp;nbsp;0;&amp;nbsp;i--)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;da&amp;nbsp;=&amp;nbsp;a.charCodeAt(i)&amp;nbsp;-&amp;nbsp;48;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;p&amp;nbsp;=&amp;nbsp;da&amp;nbsp;*&amp;nbsp;k&amp;nbsp;+&amp;nbsp;carry;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.push(p&amp;nbsp;%&amp;nbsp;10);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;carry&amp;nbsp;=&amp;nbsp;Math.floor(p&amp;nbsp;/&amp;nbsp;10);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(carry)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.push(carry&amp;nbsp;%&amp;nbsp;10);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;carry&amp;nbsp;=&amp;nbsp;Math.floor(carry&amp;nbsp;/&amp;nbsp;10);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.reverse();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;stripLeadingZeros(out.join(&amp;quot;&amp;quot;));
}

function&amp;nbsp;divmodAbs(a:&amp;nbsp;string,&amp;nbsp;b:&amp;nbsp;string):&amp;nbsp;{&amp;nbsp;q:&amp;nbsp;string;&amp;nbsp;r:&amp;nbsp;string&amp;nbsp;}&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a&amp;nbsp;=&amp;nbsp;stripLeadingZeros(a);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;stripLeadingZeros(b);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(b&amp;nbsp;===&amp;nbsp;&amp;quot;0&amp;quot;)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;Division&amp;nbsp;by&amp;nbsp;zero&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(a&amp;nbsp;===&amp;nbsp;&amp;quot;0&amp;quot;)&amp;nbsp;return&amp;nbsp;{&amp;nbsp;q:&amp;nbsp;&amp;quot;0&amp;quot;,&amp;nbsp;r:&amp;nbsp;&amp;quot;0&amp;quot;&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(cmpAbs(a,&amp;nbsp;b)&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;{&amp;nbsp;q:&amp;nbsp;&amp;quot;0&amp;quot;,&amp;nbsp;r:&amp;nbsp;a&amp;nbsp;};

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;rem&amp;nbsp;=&amp;nbsp;&amp;quot;0&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;qChars:&amp;nbsp;string[]&amp;nbsp;=&amp;nbsp;[];

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(let&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;a.length;&amp;nbsp;i++)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;digit&amp;nbsp;=&amp;nbsp;a.charAt(i);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;rem&amp;nbsp;=&amp;nbsp;rem&amp;nbsp;*&amp;nbsp;10&amp;nbsp;+&amp;nbsp;digit
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rem&amp;nbsp;=&amp;nbsp;rem&amp;nbsp;===&amp;nbsp;&amp;quot;0&amp;quot;&amp;nbsp;?&amp;nbsp;digit&amp;nbsp;:&amp;nbsp;(rem&amp;nbsp;+&amp;nbsp;digit);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rem&amp;nbsp;=&amp;nbsp;stripLeadingZeros(rem);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(cmpAbs(rem,&amp;nbsp;b)&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qChars.push(&amp;quot;0&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;find&amp;nbsp;qd&amp;nbsp;in&amp;nbsp;[1..9]
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;lo&amp;nbsp;=&amp;nbsp;0,&amp;nbsp;hi&amp;nbsp;=&amp;nbsp;9;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(lo&amp;nbsp;&amp;lt;&amp;nbsp;hi)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;mid&amp;nbsp;=&amp;nbsp;Math.ceil((lo&amp;nbsp;+&amp;nbsp;hi)&amp;nbsp;/&amp;nbsp;2);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;prod&amp;nbsp;=&amp;nbsp;mulSmallAbs(b,&amp;nbsp;mid);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;c&amp;nbsp;=&amp;nbsp;cmpAbs(prod,&amp;nbsp;rem);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(c&amp;nbsp;&amp;lt;=&amp;nbsp;0)&amp;nbsp;lo&amp;nbsp;=&amp;nbsp;mid;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;hi&amp;nbsp;=&amp;nbsp;mid&amp;nbsp;-&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;qd&amp;nbsp;=&amp;nbsp;lo;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qChars.push(String(qd));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;sub&amp;nbsp;=&amp;nbsp;mulSmallAbs(b,&amp;nbsp;qd);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rem&amp;nbsp;=&amp;nbsp;subAbs(rem,&amp;nbsp;sub);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;q&amp;nbsp;=&amp;nbsp;stripLeadingZeros(qChars.join(&amp;quot;&amp;quot;));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;r&amp;nbsp;=&amp;nbsp;stripLeadingZeros(rem);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;nbsp;q,&amp;nbsp;r&amp;nbsp;};
}

function&amp;nbsp;divmodSmallAbs(a:&amp;nbsp;string,&amp;nbsp;small:&amp;nbsp;number):&amp;nbsp;{&amp;nbsp;q:&amp;nbsp;string;&amp;nbsp;r:&amp;nbsp;number&amp;nbsp;}&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a&amp;nbsp;=&amp;nbsp;stripLeadingZeros(a);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(small&amp;nbsp;&amp;lt;=&amp;nbsp;0)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;small&amp;nbsp;divisor&amp;nbsp;must&amp;nbsp;be&amp;nbsp;positive&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(a&amp;nbsp;===&amp;nbsp;&amp;quot;0&amp;quot;)&amp;nbsp;return&amp;nbsp;{&amp;nbsp;q:&amp;nbsp;&amp;quot;0&amp;quot;,&amp;nbsp;r:&amp;nbsp;0&amp;nbsp;};

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;rem&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;out:&amp;nbsp;number[]&amp;nbsp;=&amp;nbsp;[];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(let&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;a.length;&amp;nbsp;i++)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;d&amp;nbsp;=&amp;nbsp;a.charCodeAt(i)&amp;nbsp;-&amp;nbsp;48;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;x&amp;nbsp;=&amp;nbsp;rem&amp;nbsp;*&amp;nbsp;10&amp;nbsp;+&amp;nbsp;d;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;qd&amp;nbsp;=&amp;nbsp;Math.floor(x&amp;nbsp;/&amp;nbsp;small);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rem&amp;nbsp;=&amp;nbsp;x&amp;nbsp;%&amp;nbsp;small;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.push(qd);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;nbsp;q:&amp;nbsp;stripLeadingZeros(out.join(&amp;quot;&amp;quot;)),&amp;nbsp;r:&amp;nbsp;rem&amp;nbsp;};
}

function&amp;nbsp;powAbs(base:&amp;nbsp;string,&amp;nbsp;exp:&amp;nbsp;number):&amp;nbsp;string&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!isInt(exp)&amp;nbsp;||&amp;nbsp;exp&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;exp&amp;nbsp;must&amp;nbsp;be&amp;nbsp;non-negative&amp;nbsp;integer&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(exp&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;&amp;quot;1&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;result&amp;nbsp;=&amp;nbsp;&amp;quot;1&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;b&amp;nbsp;=&amp;nbsp;stripLeadingZeros(base);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;e&amp;nbsp;=&amp;nbsp;exp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(e&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(e&amp;nbsp;&amp;amp;&amp;nbsp;1)&amp;nbsp;result&amp;nbsp;=&amp;nbsp;mulAbs(result,&amp;nbsp;b);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e&amp;nbsp;&amp;gt;&amp;gt;=&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(e)&amp;nbsp;b&amp;nbsp;=&amp;nbsp;mulAbs(b,&amp;nbsp;b);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;stripLeadingZeros(result);
}

function&amp;nbsp;appendZeros(absDigits:&amp;nbsp;string,&amp;nbsp;n:&amp;nbsp;number):&amp;nbsp;string&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(n&amp;nbsp;&amp;lt;=&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;absDigits;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(absDigits&amp;nbsp;===&amp;nbsp;&amp;quot;0&amp;quot;)&amp;nbsp;return&amp;nbsp;&amp;quot;0&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;absDigits&amp;nbsp;+&amp;nbsp;new&amp;nbsp;Array(n&amp;nbsp;+&amp;nbsp;1).join(&amp;quot;0&amp;quot;);
}

function&amp;nbsp;isOddAbs(absDigits:&amp;nbsp;string):&amp;nbsp;boolean&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;last&amp;nbsp;=&amp;nbsp;absDigits.charCodeAt(absDigits.length&amp;nbsp;-&amp;nbsp;1)&amp;nbsp;-&amp;nbsp;48;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(last&amp;nbsp;&amp;amp;&amp;nbsp;1)&amp;nbsp;===&amp;nbsp;1;
}

function&amp;nbsp;roundQuotientAbs(
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qAbs:&amp;nbsp;string,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rAbs:&amp;nbsp;string,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;denomAbs:&amp;nbsp;string,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;signExact:&amp;nbsp;Sign,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mode:&amp;nbsp;RoundingMode
):&amp;nbsp;string&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qAbs&amp;nbsp;=&amp;nbsp;stripLeadingZeros(qAbs);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rAbs&amp;nbsp;=&amp;nbsp;stripLeadingZeros(rAbs);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;denomAbs&amp;nbsp;=&amp;nbsp;stripLeadingZeros(denomAbs);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(rAbs&amp;nbsp;===&amp;nbsp;&amp;quot;0&amp;quot;)&amp;nbsp;return&amp;nbsp;qAbs;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;add1&amp;nbsp;=&amp;nbsp;()&amp;nbsp;=&amp;gt;&amp;nbsp;addAbs(qAbs,&amp;nbsp;&amp;quot;1&amp;quot;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch&amp;nbsp;(mode)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&amp;quot;DOWN&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;qAbs;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&amp;quot;UP&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;add1();

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&amp;quot;FLOOR&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;signExact&amp;nbsp;&amp;lt;&amp;nbsp;0&amp;nbsp;?&amp;nbsp;add1()&amp;nbsp;:&amp;nbsp;qAbs;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&amp;quot;CEILING&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;signExact&amp;nbsp;&amp;gt;&amp;nbsp;0&amp;nbsp;?&amp;nbsp;add1()&amp;nbsp;:&amp;nbsp;qAbs;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&amp;quot;HALF_UP&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&amp;quot;HALF_DOWN&amp;quot;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&amp;quot;HALF_EVEN&amp;quot;:&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;twiceR&amp;nbsp;=&amp;nbsp;mulSmallAbs(rAbs,&amp;nbsp;2);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;c&amp;nbsp;=&amp;nbsp;cmpAbs(twiceR,&amp;nbsp;denomAbs);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(c&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;add1();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(c&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;qAbs;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;tie
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(mode&amp;nbsp;===&amp;nbsp;&amp;quot;HALF_UP&amp;quot;)&amp;nbsp;return&amp;nbsp;add1();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(mode&amp;nbsp;===&amp;nbsp;&amp;quot;HALF_DOWN&amp;quot;)&amp;nbsp;return&amp;nbsp;qAbs;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;HALF_EVEN
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;isOddAbs(qAbs)&amp;nbsp;?&amp;nbsp;add1()&amp;nbsp;:&amp;nbsp;qAbs;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;qAbs;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}

function&amp;nbsp;gcdAbs(a:&amp;nbsp;string,&amp;nbsp;b:&amp;nbsp;string):&amp;nbsp;string&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a&amp;nbsp;=&amp;nbsp;stripLeadingZeros(a);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;stripLeadingZeros(b);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(b&amp;nbsp;!==&amp;nbsp;&amp;quot;0&amp;quot;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;r&amp;nbsp;=&amp;nbsp;divmodAbs(a,&amp;nbsp;b).r;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a&amp;nbsp;=&amp;nbsp;b;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b&amp;nbsp;=&amp;nbsp;r;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;a;
}

function&amp;nbsp;divExactAbs(a:&amp;nbsp;string,&amp;nbsp;b:&amp;nbsp;string):&amp;nbsp;string&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;dm&amp;nbsp;=&amp;nbsp;divmodAbs(a,&amp;nbsp;b);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(dm.r&amp;nbsp;!==&amp;nbsp;&amp;quot;0&amp;quot;)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;Not&amp;nbsp;divisible&amp;nbsp;exactly&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;dm.q;
}

export&amp;nbsp;class&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;sign!:&amp;nbsp;Sign;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;-1&amp;nbsp;/&amp;nbsp;0&amp;nbsp;/&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;digits!:&amp;nbsp;string;&amp;nbsp;//&amp;nbsp;abs(unscaled&amp;nbsp;int),&amp;nbsp;decimal&amp;nbsp;string,&amp;nbsp;no&amp;nbsp;leading&amp;nbsp;zeros&amp;nbsp;except&amp;nbsp;&amp;quot;0&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;scale!:&amp;nbsp;number;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;gt;=&amp;nbsp;0

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;fromParts(sign:&amp;nbsp;Sign,&amp;nbsp;digits:&amp;nbsp;string,&amp;nbsp;scale:&amp;nbsp;number):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;bd&amp;nbsp;=&amp;nbsp;Object.create(BigDecimal.prototype)&amp;nbsp;as&amp;nbsp;BigDecimal;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bd.scale&amp;nbsp;=&amp;nbsp;scale;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bd.digits&amp;nbsp;=&amp;nbsp;stripLeadingZeros(digits);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bd.sign&amp;nbsp;=&amp;nbsp;sign;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;normalize&amp;nbsp;-0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(bd.digits&amp;nbsp;===&amp;nbsp;&amp;quot;0&amp;quot;)&amp;nbsp;bd.sign&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;bd;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;constructor(value:&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint&amp;nbsp;|&amp;nbsp;BigDecimal,&amp;nbsp;scale?:&amp;nbsp;number)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;clone
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(value&amp;nbsp;instanceof&amp;nbsp;BigDecimal)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.sign&amp;nbsp;=&amp;nbsp;value.sign;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.digits&amp;nbsp;=&amp;nbsp;value.digits;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.scale&amp;nbsp;=&amp;nbsp;value.scale;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;bigint&amp;nbsp;input&amp;nbsp;(won&amp;#39;t&amp;nbsp;exist&amp;nbsp;on&amp;nbsp;Safari13,&amp;nbsp;but&amp;nbsp;kept&amp;nbsp;for&amp;nbsp;compatibility&amp;nbsp;on&amp;nbsp;modern&amp;nbsp;engines)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(typeof&amp;nbsp;value&amp;nbsp;===&amp;nbsp;&amp;quot;bigint&amp;quot;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;s&amp;nbsp;=&amp;nbsp;(scale&amp;nbsp;===&amp;nbsp;undefined&amp;nbsp;?&amp;nbsp;0&amp;nbsp;:&amp;nbsp;scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!isInt(s)&amp;nbsp;||&amp;nbsp;s&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;scale&amp;nbsp;must&amp;nbsp;be&amp;nbsp;a&amp;nbsp;non-negative&amp;nbsp;integer&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;str&amp;nbsp;=&amp;nbsp;String(value);&amp;nbsp;//&amp;nbsp;e.g.&amp;nbsp;&amp;quot;-123&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;neg&amp;nbsp;=&amp;nbsp;str.charAt(0)&amp;nbsp;===&amp;nbsp;&amp;quot;-&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;abs&amp;nbsp;=&amp;nbsp;neg&amp;nbsp;?&amp;nbsp;str.slice(1)&amp;nbsp;:&amp;nbsp;str;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.sign&amp;nbsp;=&amp;nbsp;abs&amp;nbsp;===&amp;nbsp;&amp;quot;0&amp;quot;&amp;nbsp;?&amp;nbsp;0&amp;nbsp;:&amp;nbsp;(neg&amp;nbsp;?&amp;nbsp;-1&amp;nbsp;:&amp;nbsp;1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.digits&amp;nbsp;=&amp;nbsp;stripLeadingZeros(abs);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.scale&amp;nbsp;=&amp;nbsp;s;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(typeof&amp;nbsp;value&amp;nbsp;===&amp;nbsp;&amp;quot;number&amp;quot;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!Number.isFinite(value))&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;Invalid&amp;nbsp;number&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value&amp;nbsp;=&amp;nbsp;String(value);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(typeof&amp;nbsp;value&amp;nbsp;!==&amp;nbsp;&amp;quot;string&amp;quot;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;Unsupported&amp;nbsp;value&amp;nbsp;type&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;parsed&amp;nbsp;=&amp;nbsp;BigDecimal.parseDecimalString(value);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.sign&amp;nbsp;=&amp;nbsp;parsed.sign;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.digits&amp;nbsp;=&amp;nbsp;parsed.digits;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.scale&amp;nbsp;=&amp;nbsp;parsed.scale;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static&amp;nbsp;from(value:&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint&amp;nbsp;|&amp;nbsp;BigDecimal,&amp;nbsp;scale?:&amp;nbsp;number):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;new&amp;nbsp;BigDecimal(value&amp;nbsp;as&amp;nbsp;any,&amp;nbsp;scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getScale():&amp;nbsp;number&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.scale;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/**&amp;nbsp;Safari13&amp;nbsp;版：没有&amp;nbsp;BigInt，返回“未缩放整数”的字符串（带符号）。&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unscaledValue():&amp;nbsp;any&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(this.sign&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;&amp;quot;0&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(this.sign&amp;nbsp;&amp;lt;&amp;nbsp;0&amp;nbsp;?&amp;nbsp;&amp;quot;-&amp;quot;&amp;nbsp;:&amp;nbsp;&amp;quot;&amp;quot;)&amp;nbsp;+&amp;nbsp;this.digits;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;signum():&amp;nbsp;-1&amp;nbsp;|&amp;nbsp;0&amp;nbsp;|&amp;nbsp;1&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.sign;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;abs():&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(this.sign&amp;nbsp;&amp;gt;=&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;this;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(1,&amp;nbsp;this.digits,&amp;nbsp;this.scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;negate():&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(this.sign&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;this;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts((this.sign&amp;nbsp;===&amp;nbsp;1&amp;nbsp;?&amp;nbsp;-1&amp;nbsp;:&amp;nbsp;1),&amp;nbsp;this.digits,&amp;nbsp;this.scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add(other:&amp;nbsp;BigDecimal&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;b&amp;nbsp;=&amp;nbsp;BigDecimal.from(other);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;s&amp;nbsp;=&amp;nbsp;Math.max(this.scale,&amp;nbsp;b.scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;aDigits&amp;nbsp;=&amp;nbsp;appendZeros(this.digits,&amp;nbsp;s&amp;nbsp;-&amp;nbsp;this.scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;bDigits&amp;nbsp;=&amp;nbsp;appendZeros(b.digits,&amp;nbsp;s&amp;nbsp;-&amp;nbsp;b.scale);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(this.sign&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(b.sign,&amp;nbsp;bDigits,&amp;nbsp;s);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(b.sign&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(this.sign,&amp;nbsp;aDigits,&amp;nbsp;s);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(this.sign&amp;nbsp;===&amp;nbsp;b.sign)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;sum&amp;nbsp;=&amp;nbsp;addAbs(aDigits,&amp;nbsp;bDigits);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(this.sign,&amp;nbsp;sum,&amp;nbsp;s);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;different&amp;nbsp;signs&amp;nbsp;=&amp;gt;&amp;nbsp;subtraction
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;c&amp;nbsp;=&amp;nbsp;cmpAbs(aDigits,&amp;nbsp;bDigits);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(c&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;result&amp;nbsp;is&amp;nbsp;0,&amp;nbsp;keep&amp;nbsp;scale&amp;nbsp;=&amp;nbsp;s&amp;nbsp;(like&amp;nbsp;your&amp;nbsp;BigInt&amp;nbsp;version)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(0,&amp;nbsp;&amp;quot;0&amp;quot;,&amp;nbsp;s);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(c&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;diff&amp;nbsp;=&amp;nbsp;subAbs(aDigits,&amp;nbsp;bDigits);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(this.sign,&amp;nbsp;diff,&amp;nbsp;s);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;diff&amp;nbsp;=&amp;nbsp;subAbs(bDigits,&amp;nbsp;aDigits);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(b.sign,&amp;nbsp;diff,&amp;nbsp;s);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sub(other:&amp;nbsp;BigDecimal&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;b&amp;nbsp;=&amp;nbsp;BigDecimal.from(other);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.add(b.negate());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mul(other:&amp;nbsp;BigDecimal&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;b&amp;nbsp;=&amp;nbsp;BigDecimal.from(other);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(this.sign&amp;nbsp;===&amp;nbsp;0&amp;nbsp;||&amp;nbsp;b.sign&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(0,&amp;nbsp;&amp;quot;0&amp;quot;,&amp;nbsp;this.scale&amp;nbsp;+&amp;nbsp;b.scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;sign:&amp;nbsp;Sign&amp;nbsp;=&amp;nbsp;(this.sign&amp;nbsp;===&amp;nbsp;b.sign&amp;nbsp;?&amp;nbsp;1&amp;nbsp;:&amp;nbsp;-1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;prod&amp;nbsp;=&amp;nbsp;mulAbs(this.digits,&amp;nbsp;b.digits);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(sign,&amp;nbsp;prod,&amp;nbsp;this.scale&amp;nbsp;+&amp;nbsp;b.scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;divide(other:&amp;nbsp;BigDecimal&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint):&amp;nbsp;BigDecimal;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;divide(other:&amp;nbsp;BigDecimal&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint,&amp;nbsp;resultScale:&amp;nbsp;number,&amp;nbsp;rounding:&amp;nbsp;RoundingMode):&amp;nbsp;BigDecimal;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;divide(other:&amp;nbsp;BigDecimal&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint,&amp;nbsp;resultScale?:&amp;nbsp;number,&amp;nbsp;rounding?:&amp;nbsp;RoundingMode):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;b&amp;nbsp;=&amp;nbsp;BigDecimal.from(other);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(b.sign&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;Division&amp;nbsp;by&amp;nbsp;zero&amp;quot;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(resultScale&amp;nbsp;===&amp;nbsp;undefined)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.divideExact(b);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;rm:&amp;nbsp;RoundingMode&amp;nbsp;=&amp;nbsp;rounding&amp;nbsp;?&amp;nbsp;rounding&amp;nbsp;:&amp;nbsp;&amp;quot;HALF_UP&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.divideScaled(b,&amp;nbsp;resultScale,&amp;nbsp;rm);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setScale(newScale:&amp;nbsp;number,&amp;nbsp;rounding:&amp;nbsp;RoundingMode&amp;nbsp;=&amp;nbsp;&amp;quot;HALF_UP&amp;quot;):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!isInt(newScale)&amp;nbsp;||&amp;nbsp;newScale&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;newScale&amp;nbsp;must&amp;nbsp;be&amp;nbsp;a&amp;nbsp;non-negative&amp;nbsp;integer&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(newScale&amp;nbsp;===&amp;nbsp;this.scale)&amp;nbsp;return&amp;nbsp;this;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(newScale&amp;nbsp;&amp;gt;&amp;nbsp;this.scale)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;diff&amp;nbsp;=&amp;nbsp;newScale&amp;nbsp;-&amp;nbsp;this.scale;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;newDigits&amp;nbsp;=&amp;nbsp;appendZeros(this.digits,&amp;nbsp;diff);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(this.sign,&amp;nbsp;newDigits,&amp;nbsp;newScale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;newScale&amp;nbsp;&amp;lt;&amp;nbsp;this.scale&amp;nbsp;=&amp;gt;&amp;nbsp;divide&amp;nbsp;by&amp;nbsp;10^(diff)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;diff&amp;nbsp;=&amp;nbsp;this.scale&amp;nbsp;-&amp;nbsp;newScale;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;qAbs&amp;nbsp;/&amp;nbsp;rAbs&amp;nbsp;when&amp;nbsp;dividing&amp;nbsp;by&amp;nbsp;10^diff&amp;nbsp;can&amp;nbsp;be&amp;nbsp;done&amp;nbsp;by&amp;nbsp;slicing
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;denomAbs&amp;nbsp;=&amp;nbsp;&amp;quot;1&amp;quot;&amp;nbsp;+&amp;nbsp;new&amp;nbsp;Array(diff&amp;nbsp;+&amp;nbsp;1).join(&amp;quot;0&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;len&amp;nbsp;=&amp;nbsp;this.digits.length;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;qAbs:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;rAbs:&amp;nbsp;string;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(len&amp;nbsp;&amp;lt;=&amp;nbsp;diff)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qAbs&amp;nbsp;=&amp;nbsp;&amp;quot;0&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rAbs&amp;nbsp;=&amp;nbsp;this.digits;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qAbs&amp;nbsp;=&amp;nbsp;stripLeadingZeros(this.digits.slice(0,&amp;nbsp;len&amp;nbsp;-&amp;nbsp;diff));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rAbs&amp;nbsp;=&amp;nbsp;stripLeadingZeros(this.digits.slice(len&amp;nbsp;-&amp;nbsp;diff));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;roundedQAbs&amp;nbsp;=&amp;nbsp;roundQuotientAbs(qAbs,&amp;nbsp;rAbs,&amp;nbsp;denomAbs,&amp;nbsp;this.sign,&amp;nbsp;rounding);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(this.sign,&amp;nbsp;roundedQAbs,&amp;nbsp;newScale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stripTrailingZeros():&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(this.sign&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;this;&amp;nbsp;//&amp;nbsp;keep&amp;nbsp;representation&amp;nbsp;scale
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;d&amp;nbsp;=&amp;nbsp;this.digits;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;s&amp;nbsp;=&amp;nbsp;this.scale;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(s&amp;nbsp;&amp;gt;&amp;nbsp;0&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;d.length&amp;nbsp;&amp;gt;&amp;nbsp;1&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;d.charAt(d.length&amp;nbsp;-&amp;nbsp;1)&amp;nbsp;===&amp;nbsp;&amp;quot;0&amp;quot;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d&amp;nbsp;=&amp;nbsp;d.slice(0,&amp;nbsp;-1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s&amp;nbsp;-=&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(d&amp;nbsp;===&amp;nbsp;this.digits&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;s&amp;nbsp;===&amp;nbsp;this.scale)&amp;nbsp;return&amp;nbsp;this;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(this.sign,&amp;nbsp;d,&amp;nbsp;s);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;compareTo(other:&amp;nbsp;BigDecimal&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint):&amp;nbsp;-1&amp;nbsp;|&amp;nbsp;0&amp;nbsp;|&amp;nbsp;1&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;b&amp;nbsp;=&amp;nbsp;BigDecimal.from(other);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(this.sign&amp;nbsp;&amp;lt;&amp;nbsp;b.sign)&amp;nbsp;return&amp;nbsp;-1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(this.sign&amp;nbsp;&amp;gt;&amp;nbsp;b.sign)&amp;nbsp;return&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(this.sign&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;0;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;s&amp;nbsp;=&amp;nbsp;Math.max(this.scale,&amp;nbsp;b.scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;aDigits&amp;nbsp;=&amp;nbsp;appendZeros(this.digits,&amp;nbsp;s&amp;nbsp;-&amp;nbsp;this.scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;bDigits&amp;nbsp;=&amp;nbsp;appendZeros(b.digits,&amp;nbsp;s&amp;nbsp;-&amp;nbsp;b.scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;c&amp;nbsp;=&amp;nbsp;cmpAbs(aDigits,&amp;nbsp;bDigits);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.sign&amp;nbsp;&amp;gt;&amp;nbsp;0&amp;nbsp;?&amp;nbsp;c&amp;nbsp;:&amp;nbsp;(c&amp;nbsp;===&amp;nbsp;0&amp;nbsp;?&amp;nbsp;0&amp;nbsp;:&amp;nbsp;(c&amp;nbsp;===&amp;nbsp;1&amp;nbsp;?&amp;nbsp;-1&amp;nbsp;:&amp;nbsp;1));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;equals(other:&amp;nbsp;BigDecimal&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint):&amp;nbsp;boolean&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;b&amp;nbsp;=&amp;nbsp;BigDecimal.from(other);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.scale&amp;nbsp;===&amp;nbsp;b.scale&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;this.sign&amp;nbsp;===&amp;nbsp;b.sign&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;this.digits&amp;nbsp;===&amp;nbsp;b.digits;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;equalsValue(other:&amp;nbsp;BigDecimal&amp;nbsp;|&amp;nbsp;string&amp;nbsp;|&amp;nbsp;number&amp;nbsp;|&amp;nbsp;bigint):&amp;nbsp;boolean&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.compareTo(other)&amp;nbsp;===&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;precision():&amp;nbsp;number&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(this.sign&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.digits.length;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;round(mc:&amp;nbsp;MathContext):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!mc&amp;nbsp;||&amp;nbsp;!isInt(mc.precision)&amp;nbsp;||&amp;nbsp;mc.precision&amp;nbsp;&amp;lt;&amp;nbsp;1)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;MathContext.precision&amp;nbsp;must&amp;nbsp;be&amp;nbsp;an&amp;nbsp;integer&amp;nbsp;&amp;gt;=&amp;nbsp;1&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;rm:&amp;nbsp;RoundingMode&amp;nbsp;=&amp;nbsp;mc.roundingMode&amp;nbsp;?&amp;nbsp;mc.roundingMode&amp;nbsp;:&amp;nbsp;&amp;quot;HALF_UP&amp;quot;;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;curPrec&amp;nbsp;=&amp;nbsp;this.precision();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(curPrec&amp;nbsp;&amp;lt;=&amp;nbsp;mc.precision)&amp;nbsp;return&amp;nbsp;this;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;drop&amp;nbsp;=&amp;nbsp;curPrec&amp;nbsp;-&amp;nbsp;mc.precision;&amp;nbsp;//&amp;nbsp;digits&amp;nbsp;to&amp;nbsp;drop&amp;nbsp;from&amp;nbsp;unscaled
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;denomAbs&amp;nbsp;=&amp;nbsp;&amp;quot;1&amp;quot;&amp;nbsp;+&amp;nbsp;new&amp;nbsp;Array(drop&amp;nbsp;+&amp;nbsp;1).join(&amp;quot;0&amp;quot;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;len&amp;nbsp;=&amp;nbsp;this.digits.length;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;qAbs:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;rAbs:&amp;nbsp;string;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(len&amp;nbsp;&amp;lt;=&amp;nbsp;drop)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qAbs&amp;nbsp;=&amp;nbsp;&amp;quot;0&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rAbs&amp;nbsp;=&amp;nbsp;this.digits;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;qAbs&amp;nbsp;=&amp;nbsp;stripLeadingZeros(this.digits.slice(0,&amp;nbsp;len&amp;nbsp;-&amp;nbsp;drop));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rAbs&amp;nbsp;=&amp;nbsp;stripLeadingZeros(this.digits.slice(len&amp;nbsp;-&amp;nbsp;drop));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;roundedQAbs&amp;nbsp;=&amp;nbsp;roundQuotientAbs(qAbs,&amp;nbsp;rAbs,&amp;nbsp;denomAbs,&amp;nbsp;this.sign,&amp;nbsp;rm);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;newScale&amp;nbsp;=&amp;nbsp;this.scale&amp;nbsp;-&amp;nbsp;drop;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;newDigits&amp;nbsp;=&amp;nbsp;roundedQAbs;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(newScale&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newDigits&amp;nbsp;=&amp;nbsp;appendZeros(newDigits,&amp;nbsp;-newScale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newScale&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(this.sign,&amp;nbsp;newDigits,&amp;nbsp;newScale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;movePointLeft(n:&amp;nbsp;number):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!isInt(n))&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;n&amp;nbsp;must&amp;nbsp;be&amp;nbsp;an&amp;nbsp;integer&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(n&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;this;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(n&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;this.movePointRight(-n);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(this.sign,&amp;nbsp;this.digits,&amp;nbsp;this.scale&amp;nbsp;+&amp;nbsp;n);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;movePointRight(n:&amp;nbsp;number):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!isInt(n))&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;n&amp;nbsp;must&amp;nbsp;be&amp;nbsp;an&amp;nbsp;integer&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(n&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;this;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(n&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;this.movePointLeft(-n);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;newScale&amp;nbsp;=&amp;nbsp;this.scale&amp;nbsp;-&amp;nbsp;n;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(newScale&amp;nbsp;&amp;gt;=&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(this.sign,&amp;nbsp;this.digits,&amp;nbsp;newScale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;scale&amp;nbsp;would&amp;nbsp;become&amp;nbsp;negative&amp;nbsp;=&amp;gt;&amp;nbsp;expand&amp;nbsp;digits&amp;nbsp;and&amp;nbsp;set&amp;nbsp;scale=0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;newDigits&amp;nbsp;=&amp;nbsp;appendZeros(this.digits,&amp;nbsp;-newScale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(this.sign,&amp;nbsp;newDigits,&amp;nbsp;0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;toPlainString():&amp;nbsp;string&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;signStr&amp;nbsp;=&amp;nbsp;this.sign&amp;nbsp;&amp;lt;&amp;nbsp;0&amp;nbsp;?&amp;nbsp;&amp;quot;-&amp;quot;&amp;nbsp;:&amp;nbsp;&amp;quot;&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;abs&amp;nbsp;=&amp;nbsp;this.digits;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(this.scale&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;return&amp;nbsp;signStr&amp;nbsp;+&amp;nbsp;abs;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;s&amp;nbsp;=&amp;nbsp;abs;&amp;nbsp;//&amp;nbsp;already&amp;nbsp;a&amp;nbsp;string&amp;nbsp;digits
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;pointPos&amp;nbsp;=&amp;nbsp;s.length&amp;nbsp;-&amp;nbsp;this.scale;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(pointPos&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;intPart&amp;nbsp;=&amp;nbsp;s.slice(0,&amp;nbsp;pointPos);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;fracPart&amp;nbsp;=&amp;nbsp;s.slice(pointPos);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;signStr&amp;nbsp;+&amp;nbsp;intPart&amp;nbsp;+&amp;nbsp;&amp;quot;.&amp;quot;&amp;nbsp;+&amp;nbsp;fracPart;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;zeros&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Array((-pointPos)&amp;nbsp;+&amp;nbsp;1).join(&amp;quot;0&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;signStr&amp;nbsp;+&amp;nbsp;&amp;quot;0.&amp;quot;&amp;nbsp;+&amp;nbsp;zeros&amp;nbsp;+&amp;nbsp;s;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;toString():&amp;nbsp;string&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;this.toPlainString();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;toNumber():&amp;nbsp;number&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;Number(this.toPlainString());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;--------------------&amp;nbsp;division&amp;nbsp;helpers&amp;nbsp;--------------------

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;divideExact(divisor:&amp;nbsp;BigDecimal):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(this.sign&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;0&amp;nbsp;/&amp;nbsp;x&amp;nbsp;=&amp;nbsp;0&amp;nbsp;(scale&amp;nbsp;0&amp;nbsp;like&amp;nbsp;BigInt&amp;nbsp;version)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(0,&amp;nbsp;&amp;quot;0&amp;quot;,&amp;nbsp;0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(divisor.sign&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;Division&amp;nbsp;by&amp;nbsp;zero&amp;quot;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;signExact:&amp;nbsp;Sign&amp;nbsp;=&amp;nbsp;(this.sign&amp;nbsp;===&amp;nbsp;divisor.sign&amp;nbsp;?&amp;nbsp;1&amp;nbsp;:&amp;nbsp;-1);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;num/den&amp;nbsp;adjust&amp;nbsp;for&amp;nbsp;scales:&amp;nbsp;num&amp;nbsp;*&amp;nbsp;10^(sb-sa)&amp;nbsp;/&amp;nbsp;den
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;numAbs&amp;nbsp;=&amp;nbsp;this.digits;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;denAbs&amp;nbsp;=&amp;nbsp;divisor.digits;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;exp&amp;nbsp;=&amp;nbsp;divisor.scale&amp;nbsp;-&amp;nbsp;this.scale;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(exp&amp;nbsp;&amp;gt;=&amp;nbsp;0)&amp;nbsp;numAbs&amp;nbsp;=&amp;nbsp;appendZeros(numAbs,&amp;nbsp;exp);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;denAbs&amp;nbsp;=&amp;nbsp;appendZeros(denAbs,&amp;nbsp;-exp);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;reduce&amp;nbsp;fraction&amp;nbsp;by&amp;nbsp;gcd
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;g&amp;nbsp;=&amp;nbsp;gcdAbs(numAbs,&amp;nbsp;denAbs);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;numAbs&amp;nbsp;=&amp;nbsp;divExactAbs(numAbs,&amp;nbsp;g);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;denAbs&amp;nbsp;=&amp;nbsp;divExactAbs(denAbs,&amp;nbsp;g);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;den&amp;nbsp;must&amp;nbsp;be&amp;nbsp;2^a&amp;nbsp;*&amp;nbsp;5^b&amp;nbsp;for&amp;nbsp;terminating&amp;nbsp;decimal
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;d&amp;nbsp;=&amp;nbsp;denAbs;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;p2&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;p5&amp;nbsp;=&amp;nbsp;0;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(d&amp;nbsp;!==&amp;nbsp;&amp;quot;0&amp;quot;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;dm2&amp;nbsp;=&amp;nbsp;divmodSmallAbs(d,&amp;nbsp;2);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(dm2.r&amp;nbsp;!==&amp;nbsp;0)&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d&amp;nbsp;=&amp;nbsp;dm2.q;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p2++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;(d&amp;nbsp;!==&amp;nbsp;&amp;quot;0&amp;quot;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;dm5&amp;nbsp;=&amp;nbsp;divmodSmallAbs(d,&amp;nbsp;5);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(dm5.r&amp;nbsp;!==&amp;nbsp;0)&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d&amp;nbsp;=&amp;nbsp;dm5.q;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p5++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(stripLeadingZeros(d)&amp;nbsp;!==&amp;nbsp;&amp;quot;1&amp;quot;)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;Non-terminating&amp;nbsp;decimal&amp;nbsp;expansion;&amp;nbsp;specify&amp;nbsp;scale&amp;nbsp;and&amp;nbsp;rounding&amp;nbsp;mode&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;s&amp;nbsp;=&amp;nbsp;Math.max(p2,&amp;nbsp;p5);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;mul2&amp;nbsp;=&amp;nbsp;powAbs(&amp;quot;2&amp;quot;,&amp;nbsp;s&amp;nbsp;-&amp;nbsp;p2);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;mul5&amp;nbsp;=&amp;nbsp;powAbs(&amp;quot;5&amp;quot;,&amp;nbsp;s&amp;nbsp;-&amp;nbsp;p5);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;intAbs&amp;nbsp;=&amp;nbsp;mulAbs(numAbs,&amp;nbsp;mul2);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intAbs&amp;nbsp;=&amp;nbsp;mulAbs(intAbs,&amp;nbsp;mul5);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(signExact,&amp;nbsp;intAbs,&amp;nbsp;s);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;divideScaled(divisor:&amp;nbsp;BigDecimal,&amp;nbsp;resultScale:&amp;nbsp;number,&amp;nbsp;rounding:&amp;nbsp;RoundingMode):&amp;nbsp;BigDecimal&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!isInt(resultScale)&amp;nbsp;||&amp;nbsp;resultScale&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;resultScale&amp;nbsp;must&amp;nbsp;be&amp;nbsp;a&amp;nbsp;non-negative&amp;nbsp;integer&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(divisor.sign&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;Division&amp;nbsp;by&amp;nbsp;zero&amp;quot;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(this.sign&amp;nbsp;===&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(0,&amp;nbsp;&amp;quot;0&amp;quot;,&amp;nbsp;resultScale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;signExact:&amp;nbsp;Sign&amp;nbsp;=&amp;nbsp;(this.sign&amp;nbsp;===&amp;nbsp;divisor.sign&amp;nbsp;?&amp;nbsp;1&amp;nbsp;:&amp;nbsp;-1);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;exp&amp;nbsp;=&amp;nbsp;resultScale&amp;nbsp;+&amp;nbsp;sb&amp;nbsp;-&amp;nbsp;sa
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;exp&amp;nbsp;=&amp;nbsp;resultScale&amp;nbsp;+&amp;nbsp;divisor.scale&amp;nbsp;-&amp;nbsp;this.scale;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;numeratorAbs:&amp;nbsp;string;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;denominatorAbs:&amp;nbsp;string;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(exp&amp;nbsp;&amp;gt;=&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;numeratorAbs&amp;nbsp;=&amp;nbsp;appendZeros(this.digits,&amp;nbsp;exp);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;denominatorAbs&amp;nbsp;=&amp;nbsp;divisor.digits;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;numeratorAbs&amp;nbsp;=&amp;nbsp;this.digits;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;denominatorAbs&amp;nbsp;=&amp;nbsp;appendZeros(divisor.digits,&amp;nbsp;-exp);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;denominator&amp;nbsp;is&amp;nbsp;positive&amp;nbsp;abs&amp;nbsp;here
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;dm&amp;nbsp;=&amp;nbsp;divmodAbs(numeratorAbs,&amp;nbsp;denominatorAbs);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;qAbs&amp;nbsp;=&amp;nbsp;dm.q;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;rAbs&amp;nbsp;=&amp;nbsp;dm.r;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;roundedQAbs&amp;nbsp;=&amp;nbsp;roundQuotientAbs(qAbs,&amp;nbsp;rAbs,&amp;nbsp;denominatorAbs,&amp;nbsp;signExact,&amp;nbsp;rounding);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;BigDecimal.fromParts(signExact,&amp;nbsp;roundedQAbs,&amp;nbsp;resultScale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;--------------------&amp;nbsp;parsing&amp;nbsp;--------------------

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;parseDecimalString(input:&amp;nbsp;string):&amp;nbsp;{&amp;nbsp;sign:&amp;nbsp;Sign;&amp;nbsp;digits:&amp;nbsp;string;&amp;nbsp;scale:&amp;nbsp;number&amp;nbsp;}&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;str&amp;nbsp;=&amp;nbsp;(input&amp;nbsp;||&amp;nbsp;&amp;quot;&amp;quot;).trim();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!str)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;Empty&amp;nbsp;decimal&amp;quot;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;[+|-]?&amp;nbsp;(digits?&amp;nbsp;&amp;quot;.&amp;quot;&amp;nbsp;digits?&amp;nbsp;|&amp;nbsp;&amp;quot;.&amp;quot;&amp;nbsp;digits)&amp;nbsp;(&amp;nbsp;[eE][+|-]?digits&amp;nbsp;)?
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;m&amp;nbsp;=&amp;nbsp;/^([+-])?(?:(\d+)?(?:\.(\d*)?)?|\.(\d+))(?:[eE]([+-]?\d+))?$/.exec(str);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!m)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;Invalid&amp;nbsp;decimal&amp;nbsp;string:&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;input);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;signChar&amp;nbsp;=&amp;nbsp;m[1]&amp;nbsp;||&amp;nbsp;&amp;quot;&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;sign:&amp;nbsp;Sign&amp;nbsp;=&amp;nbsp;signChar&amp;nbsp;===&amp;nbsp;&amp;quot;-&amp;quot;&amp;nbsp;?&amp;nbsp;-1&amp;nbsp;:&amp;nbsp;1;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;intPart&amp;nbsp;=&amp;nbsp;m[2]&amp;nbsp;?&amp;nbsp;m[2]&amp;nbsp;:&amp;nbsp;&amp;quot;&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;fracPart&amp;nbsp;=&amp;nbsp;(m[4]&amp;nbsp;?&amp;nbsp;m[4]&amp;nbsp;:&amp;nbsp;(m[3]&amp;nbsp;?&amp;nbsp;m[3]&amp;nbsp;:&amp;nbsp;&amp;quot;&amp;quot;));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;expStr&amp;nbsp;=&amp;nbsp;m[5]&amp;nbsp;?&amp;nbsp;m[5]&amp;nbsp;:&amp;nbsp;&amp;quot;0&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;const&amp;nbsp;exp&amp;nbsp;=&amp;nbsp;Number(expStr);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!isInt(exp))&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;Invalid&amp;nbsp;exponent:&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;expStr);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;digits&amp;nbsp;=&amp;nbsp;stripLeadingZeros((intPart&amp;nbsp;+&amp;nbsp;fracPart)&amp;nbsp;||&amp;nbsp;&amp;quot;0&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;let&amp;nbsp;scale&amp;nbsp;=&amp;nbsp;fracPart.length&amp;nbsp;-&amp;nbsp;exp;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(scale&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;digits&amp;nbsp;=&amp;nbsp;appendZeros(digits,&amp;nbsp;-scale);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scale&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;normalize&amp;nbsp;sign&amp;nbsp;for&amp;nbsp;zero,&amp;nbsp;but&amp;nbsp;keep&amp;nbsp;scale&amp;nbsp;representation
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(digits&amp;nbsp;===&amp;nbsp;&amp;quot;0&amp;quot;)&amp;nbsp;sign&amp;nbsp;=&amp;nbsp;0;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!isInt(scale)&amp;nbsp;||&amp;nbsp;scale&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;Error(&amp;quot;Invalid&amp;nbsp;scale&amp;nbsp;after&amp;nbsp;parsing&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{&amp;nbsp;sign,&amp;nbsp;digits,&amp;nbsp;scale&amp;nbsp;};
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 06 Feb 2026 14:55:37 +0800</pubDate></item><item><title>JavaScript中，实现数组 sum/avg/min/max</title><link>https://www.yangguangdream.com/?id=2269</link><description>&lt;p&gt;
    JavaScript中实现类似于Java 的 数组操作
&lt;/p&gt;
&lt;p&gt;
    直接上代码（TypeScript写法）
&lt;/p&gt;
&lt;pre class=&quot;prism-highlight prism-language-typescript&quot;&gt;/**
 * ArrayAgg - 数据组合工具
 * https://www.yangguangdream.com/?id=2269
 * 
 * 
 * 用法：
 * ArrayAgg.of(list).mapToInt(x =&amp;gt; x.price * x.count).sum()
 * ArrayAgg.of(list).sumBy(x =&amp;gt; x.count)
 * ArrayAgg.of(list).count(x =&amp;gt; x.count &amp;gt; 0)
 * ArrayAgg.of(list).anyMatch(x =&amp;gt; x.count &amp;gt; 0)
 * ArrayAgg.of(list).allMatch(x =&amp;gt; x.count &amp;gt; 0)
 * ArrayAgg.of(list).mapToInt(x =&amp;gt; x.count).sum()
 * ArrayAgg.of(list).mapToInt(x =&amp;gt; x.count).count()
 * ArrayAgg.of(list).mapToInt(x =&amp;gt; x.count).avg()
 * ArrayAgg.of(list).mapToInt(x =&amp;gt; x.count).min()
 * ArrayAgg.of(list).mapToInt(x =&amp;gt; x.count).max()
 */
export class ArrayAgg&amp;lt;T&amp;gt; {
  private readonly arr: readonly T[];

  private constructor(arr: readonly T[]) {
    this.arr = arr ?? [];
  }
  //实例化
  static of&amp;lt;T&amp;gt;(arr: readonly T[] | null | undefined): ArrayAgg&amp;lt;T&amp;gt; {
    return new ArrayAgg&amp;lt;T&amp;gt;(arr ?? []);
  }

  //就是类似Java里面的mapToInt，返回IntAgg对象（数字聚合器，用来进行计算)
  mapToInt(selector: (item: T, index: number) =&amp;gt; number): IntAgg {
    const nums = this.arr.map((it, i) =&amp;gt; selector(it, i));
    return new IntAgg(nums);
  }

  //直接对对象数组按字段求和：sumBy(x =&amp;gt; x.xxx)
  sumBy(selector: (item: T, index: number) =&amp;gt; number): number {
    return this.mapToInt(selector).sum();
  }

  //直接计数（可选predicate过滤）
  count(predicate?: (item: T, index: number) =&amp;gt; boolean): number {
    if (!predicate) return this.arr.length;
    let c = 0;
    for (let i = 0; i &amp;lt; this.arr.length; i++) if (predicate(this.arr[i], i)) c++;
    return c;
  }

  //anyMatch：是否存在任意一个元素满足条件 ,类似于 Array.some()
  anyMatch(predicate: (item: T, index: number) =&amp;gt; boolean): boolean {
    for (let i = 0; i &amp;lt; this.arr.length; i++) if (predicate(this.arr[i], i)) return true;
    return false;
  }
  //allMatch：是否所有元素都满足条件,类似于 Array.every()
  allMatch(predicate: (item: T, index: number) =&amp;gt; boolean): boolean {
    for (let i = 0; i &amp;lt; this.arr.length; i++) if (!predicate(this.arr[i], i)) return false;
    return true;
  }
}

//数字聚合器类：sum/avg/min/max
export class IntAgg {
  private readonly nums: readonly number[];

  constructor(nums: readonly number[]) {
    this.nums = nums ?? [];
  }

  //mapToInt(xxx).sum() 求和
  sum(): number {
    let s = 0;
    for (let i = 0; i &amp;lt; this.nums.length; i++) {
      const n = this.nums[i];
      // 忽略 NaN / Infinity（按你需要也可以改成 throw）
      if (Number.isFinite(n)) s += n;
    }
    return s;
  }
  //mapToInt(xxx).count() 计数
  count(): number {
    return this.nums.length;
  }
  //mapToInt(xxx).avg() 平均值
  avg(): number {
    const c = this.count();
    return c === 0 ? 0 : this.sum() / c;
  }
  //mapToInt(xxx).min() 最小值
  min(): number | undefined {
    let m: number | undefined = undefined;
    for (const n of this.nums) {
      if (!Number.isFinite(n)) continue;
      if (m === undefined || n &amp;lt; m) m = n;
    }
    return m;
  }

  //mapToInt(xxx).max() 最大值
  max(): number | undefined {
    let m: number | undefined = undefined;
    for (const n of this.nums) {
      if (!Number.isFinite(n)) continue;
      if (m === undefined || n &amp;gt; m) m = n;
    }
    return m;
  }
}&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;</description><pubDate>Tue, 27 Jan 2026 12:27:22 +0800</pubDate></item><item><title>JavaScript 数组扩展 Array.some() 和 Array.every() 的区别</title><link>https://www.yangguangdream.com/?id=2268</link><description>&lt;p&gt;
    首先说他俩的区别：
&lt;/p&gt;
&lt;p&gt;
    1、Array.some() 用于检测数组中的元素&lt;span style=&quot;color: #FF0000;&quot;&gt;是否有满足&lt;/span&gt;指定条件的，若有，返回true如果全都不满足，则返回false
&lt;/p&gt;
&lt;p&gt;
    2、Array.every() 则与some相反，检测数组中元素是否&lt;span style=&quot;color: #FF0000;&quot;&gt;全部满足&lt;/span&gt;指定条件，如果全部满足，返回true，如果有一个条件不满足，则返回false
&lt;/p&gt;
&lt;p&gt;
    &lt;br/&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;strong&gt;一、Array.some()&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
    语法（你可以把它理解成为一个foreach循环，你需要为当前循环到的元素，返回一个true/false）：
&lt;/p&gt;
&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;   let arr=[];
   arr.some((item,index,array)=&amp;gt;{
    //item为当前的对象
    //index为当前的索引
    //array为当前的数组对象

    
   });&lt;/pre&gt;
&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;
    &lt;li&gt;
        &lt;p&gt;
            some() 会依次执行数组的每个元素
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;
            如果其中任意一个数组满足条件，就是说function里面返回了false，则剩余元素不再检测，直接返回true，
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;
            如果这个数组循环了一圈下来没有符合条件的元素，则返回false&lt;br/&gt;
        &lt;/p&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
    &lt;strong&gt;请注意：&lt;/strong&gt;
&lt;/p&gt;
&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: decimal;&quot;&gt;
    &lt;li&gt;
        &lt;p&gt;
            some()不会对空数组检测
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;
            some()不会改变原数组&lt;br/&gt;
        &lt;/p&gt;
    &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
    &lt;br/&gt;
&lt;/p&gt;
&lt;p&gt;
    &lt;strong&gt;案例：&lt;/strong&gt;&lt;br/&gt;
&lt;/p&gt;
&lt;p&gt;
    我有一个采购清单，我需要查找一下有没有大于200元的物品，并且要找一下是否有已经购买的东西（防止买重）
&lt;/p&gt;
&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;   const arr=[{
    prodName:&amp;quot;键盘&amp;quot;,
    price:100,
    isPurchased:false,
    isArrival:false
   },{
    prodName:&amp;quot;显示器&amp;quot;,
    price:300,
    isPurchased:false,
    isArrival:false
   },
  {
    prodName:&amp;quot;鼠标&amp;quot;,
    price:50,
    isPurchased:false,
    isArrival:false
   }];
   //查找是否有大于200元的物品
   const res= arr.some((item,index,array)=&amp;gt;{
      return item.price&amp;gt;200
   });
   console.log(&amp;quot;是否有大于200的物品：&amp;quot;,res);
  //查找是否有已经购买的物品
   const resIsPurchased= arr.some((item,index,array)=&amp;gt;{
      return item.isPurchased==true;
   });
   console.log(&amp;quot;是否有已经购买的物品&amp;quot;,resIsPurchased);&lt;/pre&gt;
&lt;p&gt;
    &lt;strong&gt;二、Array.every()&lt;/strong&gt;&lt;br/&gt;
&lt;/p&gt;
&lt;p&gt;
    语法：和some一样，也可以&lt;span style=&quot;text-wrap-mode: wrap;&quot;&gt;理解成为一个foreach循环，你需要为当前循环到的元素，返回一个true/false&lt;/span&gt;
&lt;/p&gt;
&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;let arr=[];
   arr.every((item,index,array)=&amp;gt;{
    //item为当前的对象
    //index为当前的索引
    //array为当前的数组对象

   
   });&lt;/pre&gt;
&lt;p&gt;
    &lt;span style=&quot;text-wrap-mode: wrap;&quot;&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;text-wrap-mode: wrap;&quot;&gt;
    &lt;li&gt;
        &lt;p&gt;
            every() 会使用指定函数检测数组中的所有元素
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;
            如果元素中有任意一个元素不满足（function中返回false），则会立即返回false,
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;
            如果所有元素都满足条件，则返回true
        &lt;/p&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-wrap-mode: wrap;&quot;&gt;
    &lt;strong&gt;请注意：&lt;/strong&gt;
&lt;/p&gt;
&lt;ol class=&quot; list-paddingleft-2&quot; style=&quot;text-wrap-mode: wrap;&quot;&gt;
    &lt;li&gt;
        &lt;p&gt;
            some()不会对空数组检测
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;
            some()不会改变原数组
        &lt;/p&gt;
    &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
    案例：
&lt;/p&gt;
&lt;p&gt;
    还是那个采购单，我要找一下是否全部购买，并且全部到货了
&lt;/p&gt;
&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;   const arr=[{
    prodName:&amp;quot;键盘&amp;quot;,
    price:100,
    isPurchased:true,
    isArrival:true
   },{
    prodName:&amp;quot;显示器&amp;quot;,
    price:300,
    isPurchased:true,
    isArrival:true
   },
  {
    prodName:&amp;quot;鼠标&amp;quot;,
    price:50,
    isPurchased:true,
    isArrival:false
   }];
   //查找是否全部购买了
   const allPurchasedRes=arr.every((item,index,array)=&amp;gt;{
    return item.isPurchased==true;
   });
   console.log(&amp;quot;物品是否全部购买：&amp;quot;,allPurchasedRes);
   //查找是否全部到货
   const allArrivalRes=arr.every((item,index,array)=&amp;gt;{
    return item.isArrival==true;
   });
   console.log(&amp;quot;是否全部到货&amp;quot;,allArrivalRes);&lt;/pre&gt;
&lt;p&gt;
    &lt;br/&gt;
&lt;/p&gt;</description><pubDate>Wed, 21 Jan 2026 17:00:51 +0800</pubDate></item><item><title>【代码】Java 匹配文本相似度 基于 Cosine Similarity</title><link>https://www.yangguangdream.com/?id=2267</link><description>&lt;p&gt;直接上代码（返回0-1的小数，数值越大匹配度越高）&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-java&quot;&gt;import&amp;nbsp;java.util.HashMap;
import&amp;nbsp;java.util.Map;

public&amp;nbsp;class&amp;nbsp;CosineSimilarityUtil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//计算两个字符串的字符频向量
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;static&amp;nbsp;Map&amp;lt;String,&amp;nbsp;Integer&amp;gt;&amp;nbsp;getCharacterFrequency(String&amp;nbsp;text)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Map&amp;lt;String,&amp;nbsp;Integer&amp;gt;&amp;nbsp;frequencyMap&amp;nbsp;=&amp;nbsp;new&amp;nbsp;HashMap&amp;lt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char[]&amp;nbsp;chars&amp;nbsp;=&amp;nbsp;text.toCharArray();//按字符分割
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(char&amp;nbsp;c&amp;nbsp;:&amp;nbsp;chars)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;charStr&amp;nbsp;=&amp;nbsp;String.valueOf(c);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;frequencyMap.put(charStr,&amp;nbsp;frequencyMap.getOrDefault(charStr,&amp;nbsp;0)&amp;nbsp;+&amp;nbsp;1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;frequencyMap;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//计算Cosine相似度
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;double&amp;nbsp;calculateCosineSimilarity(String&amp;nbsp;text1,&amp;nbsp;String&amp;nbsp;text2)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Map&amp;lt;String,&amp;nbsp;Integer&amp;gt;&amp;nbsp;freqMap1&amp;nbsp;=&amp;nbsp;getCharacterFrequency(text1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Map&amp;lt;String,&amp;nbsp;Integer&amp;gt;&amp;nbsp;freqMap2&amp;nbsp;=&amp;nbsp;getCharacterFrequency(text2);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//计算点积
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double&amp;nbsp;dotProduct&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(String&amp;nbsp;charStr&amp;nbsp;:&amp;nbsp;freqMap1.keySet())&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(freqMap2.containsKey(charStr))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dotProduct&amp;nbsp;+=&amp;nbsp;freqMap1.get(charStr)&amp;nbsp;*&amp;nbsp;freqMap2.get(charStr);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}



&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//计算模长
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double&amp;nbsp;magnitude1&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(int&amp;nbsp;freq&amp;nbsp;:&amp;nbsp;freqMap1.values())&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;magnitude1&amp;nbsp;+=&amp;nbsp;Math.pow(freq,&amp;nbsp;2);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;magnitude1&amp;nbsp;=&amp;nbsp;Math.sqrt(magnitude1);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double&amp;nbsp;magnitude2&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(int&amp;nbsp;freq&amp;nbsp;:&amp;nbsp;freqMap2.values())&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;magnitude2&amp;nbsp;+=&amp;nbsp;Math.pow(freq,&amp;nbsp;2);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;magnitude2&amp;nbsp;=&amp;nbsp;Math.sqrt(magnitude2);


&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//计算余弦相似度
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(magnitude1&amp;nbsp;==&amp;nbsp;0&amp;nbsp;||&amp;nbsp;magnitude2&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0.0;//避免除以0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;dotProduct&amp;nbsp;/&amp;nbsp;(magnitude1&amp;nbsp;*&amp;nbsp;magnitude2);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;main(String[]&amp;nbsp;args)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;targetText&amp;nbsp;=&amp;nbsp;&amp;quot;相卡整盒&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;matchingText1&amp;nbsp;=&amp;nbsp;&amp;quot;相卡随机一发&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;matchingText2&amp;nbsp;=&amp;nbsp;&amp;quot;吧唧随机一发&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;matchingText3&amp;nbsp;=&amp;nbsp;&amp;quot;路飞相卡&amp;quot;;



&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;相卡随机一发:&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;calculateCosineSimilarity(targetText,&amp;nbsp;matchingText1));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;吧唧随机一发:&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;calculateCosineSimilarity(targetText,&amp;nbsp;matchingText2));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;路飞相卡:&amp;nbsp;&amp;quot;&amp;nbsp;+&amp;nbsp;calculateCosineSimilarity(targetText,&amp;nbsp;matchingText3));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Mon, 15 Dec 2025 17:23:20 +0800</pubDate></item><item><title>【代码】C#实现输入密码自动隐藏</title><link>https://www.yangguangdream.com/?id=2266</link><description>&lt;p&gt;直接上代码，C# 8.0以上可以直接用&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-csharp&quot;&gt;//&amp;nbsp;密码输入时隐藏
static&amp;nbsp;string&amp;nbsp;ReadPassword()
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;password&amp;nbsp;=&amp;nbsp;&amp;quot;&amp;quot;;//密码明文
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ConsoleKeyInfo&amp;nbsp;key;//当前按键

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//只要没按enter就一直死循环读取
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&amp;nbsp;((key&amp;nbsp;=&amp;nbsp;Console.ReadKey(true)).Key&amp;nbsp;!=&amp;nbsp;ConsoleKey.Enter)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//用户按下退格键，并且当前有输入
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(key.Key&amp;nbsp;==&amp;nbsp;ConsoleKey.Backspace&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;password.Length&amp;nbsp;&amp;gt;&amp;nbsp;0)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;password&amp;nbsp;=&amp;nbsp;password[..^1];//移除最后一个字符
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.Write(&amp;quot;\b&amp;nbsp;\b&amp;quot;);//先退一格，写空格覆盖，再退回光标
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//如果输入的是正常字符
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(!char.IsControl(key.KeyChar))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;password&amp;nbsp;+=&amp;nbsp;key.KeyChar;//拼接明文
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.Write(&amp;quot;*&amp;quot;);//拼上一个*
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;password;
}&lt;/pre&gt;&lt;p&gt;使用：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-csharp&quot;&gt;&amp;nbsp;Console.Write(&amp;quot;请输入&amp;nbsp;p12&amp;nbsp;密码:&amp;nbsp;&amp;quot;);
&amp;nbsp;string&amp;nbsp;password&amp;nbsp;=&amp;nbsp;ReadPassword();&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 05 Nov 2025 17:51:44 +0800</pubDate></item><item><title>【代码】使用HTML5+CSS+SVG 实现苹果液态玻璃(Liquid Glass)效果</title><link>https://www.yangguangdream.com/?id=2265</link><description>&lt;div class=&quot;alert alert-info&quot;&gt;&lt;p&gt;来晚了，昨天发现TouTube的播放页面改了，改成了苹果的液态玻璃效果，就好奇他怎么实现的。这东西的核心理念就是【模糊背景】+【不规则扭曲】，像是透过正在晃动的水来看下面的东西一样&lt;br/&gt;&lt;/p&gt;&lt;/div&gt;&lt;h2&gt;1、原理&lt;br/&gt;&lt;/h2&gt;&lt;p&gt;使用svg 的&amp;nbsp;feDisplacementMap 这个属性 扭曲背景&lt;/p&gt;&lt;p&gt;再配合&amp;nbsp;backdrop-filter: blur(1px) 做出流动的视觉&lt;/p&gt;&lt;p&gt;传统的毛玻璃效果，我们用 backdrop-filter: blur(10px); 就能轻松搞定。但那只是一个均匀的模糊，看起来很「平」。而「液态」效果的关键在于不均匀的扭曲。&lt;/p&gt;&lt;p&gt;光线穿过一块完全平坦的毛玻璃，和穿过一块表面凹凸不平、像水波一样的玻璃，看到的景象肯定不同。后者会产生更多奇妙的折射和位移。我们的目标，就是用一张「凹凸不平的纹理图」，来告诉浏览器如何去扭曲、置换背景的像素。&lt;/p&gt;&lt;h2&gt;2、准备HTML及SVG&lt;br/&gt;&lt;/h2&gt;&lt;pre class=&quot;prism-highlight prism-language-markup&quot;&gt;&amp;lt;!--這是我們想變成液態玻璃的任何內容--&amp;gt;
&amp;lt;div&amp;nbsp;class=&amp;quot;liquid&amp;quot;&amp;gt;測試~&amp;lt;/div&amp;gt;

&amp;lt;!--svg&amp;nbsp;&amp;nbsp;濾鏡--&amp;gt;
&amp;lt;svg&amp;nbsp;width=&amp;quot;0&amp;quot;&amp;nbsp;height=&amp;quot;0&amp;quot;&amp;nbsp;style=&amp;quot;position:fixed;left:-9999px;top:-9999px&amp;quot;&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;defs&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;filter&amp;nbsp;id=&amp;quot;liquid_glass_filter&amp;quot;&amp;nbsp;x=&amp;quot;0%&amp;quot;&amp;nbsp;y=&amp;quot;0%&amp;quot;&amp;nbsp;width=&amp;quot;100%&amp;quot;&amp;nbsp;height=&amp;quot;100%&amp;quot;&amp;nbsp;filterUnits=&amp;quot;objectBoundingBox&amp;quot;&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;feTurbulence&amp;nbsp;type=&amp;quot;fractalNoise&amp;quot;&amp;nbsp;baseFrequency=&amp;quot;0.003&amp;quot;&amp;nbsp;numOctaves=&amp;quot;2&amp;quot;&amp;nbsp;seed=&amp;quot;7&amp;quot;&amp;nbsp;result=&amp;quot;noise&amp;quot;/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;feGaussianBlur&amp;nbsp;in=&amp;quot;noise&amp;quot;&amp;nbsp;stdDeviation=&amp;quot;1.2&amp;quot;&amp;nbsp;result=&amp;quot;map&amp;quot;/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;feDisplacementMap&amp;nbsp;in=&amp;quot;SourceGraphic&amp;quot;&amp;nbsp;in2=&amp;quot;map&amp;quot;&amp;nbsp;scale=&amp;quot;110&amp;quot;&amp;nbsp;xChannelSelector=&amp;quot;R&amp;quot;&amp;nbsp;yChannelSelector=&amp;quot;G&amp;quot;/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/filter&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/defs&amp;gt;
&amp;lt;/svg&amp;gt;

&amp;lt;!--&amp;nbsp;可微調參數（按需改一兩個就有感）
-&amp;nbsp;更波動：baseFrequency&amp;nbsp;調到&amp;nbsp;0.025&amp;nbsp;~&amp;nbsp;0.03&amp;nbsp;或&amp;nbsp;scale&amp;nbsp;調到&amp;nbsp;120~150。
-&amp;nbsp;更柔順：stdDeviation&amp;nbsp;調到&amp;nbsp;1.6&amp;nbsp;~&amp;nbsp;2.2。
-&amp;nbsp;降低上下晃動：把&amp;nbsp;&amp;lt;feDisplacementMap&amp;gt;&amp;nbsp;的&amp;nbsp;yChannelSelector=&amp;quot;G&amp;quot;&amp;nbsp;改成&amp;nbsp;B，上下位移會比較弱。&amp;nbsp;--&amp;gt;&lt;/pre&gt;&lt;h2&gt;3、核心CSS样式&lt;br/&gt;&lt;/h2&gt;&lt;pre class=&quot;prism-highlight prism-language-css&quot;&gt;.liquid&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;真正的液態關鍵：先模糊、再用&amp;nbsp;SVG&amp;nbsp;位移地圖扭曲背景&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;backdrop-filter:&amp;nbsp;blur(1px)&amp;nbsp;url(#liquid_glass_filter);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;用&amp;nbsp;box-shadow&amp;nbsp;取代邊框，營造厚度與光暈&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;box-shadow:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inset&amp;nbsp;0&amp;nbsp;1px&amp;nbsp;0&amp;nbsp;rgba(255,255,255,0.45),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inset&amp;nbsp;0&amp;nbsp;-1px&amp;nbsp;0&amp;nbsp;rgba(255,255,255,0.18),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inset&amp;nbsp;6px&amp;nbsp;6px&amp;nbsp;16px&amp;nbsp;rgba(255,255,255,0.12),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0&amp;nbsp;10px&amp;nbsp;28px&amp;nbsp;rgba(0,0,0,0.35);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;background:&amp;nbsp;rgba(255,255,255,&amp;nbsp;0.1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mask:&amp;nbsp;linear-gradient(90deg,&amp;nbsp;transparent,&amp;nbsp;#000);&amp;nbsp;*/

}

/*&amp;nbsp;若瀏覽器不支援&amp;nbsp;backdrop-filter，就用柔和漸層墊底&amp;nbsp;*/
@supports&amp;nbsp;not&amp;nbsp;(backdrop-filter:&amp;nbsp;blur(1px))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.liquid&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;background:&amp;nbsp;linear-gradient(135deg,&amp;nbsp;rgba(255,255,255,0.10),&amp;nbsp;rgba(255,255,255,0.04));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;h2&gt;4、实现效果&lt;br/&gt;&lt;/h2&gt;&lt;p&gt;&lt;img src=&quot;https://www.yangguangdream.com/zb_users/upload/2025/10/202510241761300362394642.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;</description><pubDate>Fri, 24 Oct 2025 17:51:24 +0800</pubDate></item><item><title>【代码】Java实现SHA1加密</title><link>https://www.yangguangdream.com/?id=2264</link><description>&lt;p&gt;这里直接就用&amp;nbsp;java.security.MessageDigest 这个类进行加密&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;直接上代码&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-java&quot;&gt;public&amp;nbsp;class&amp;nbsp;ShaUtils&amp;nbsp;{


&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;String&amp;nbsp;shaEncode(String&amp;nbsp;inStr)&amp;nbsp;throws&amp;nbsp;Exception&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MessageDigest&amp;nbsp;sha&amp;nbsp;=&amp;nbsp;null;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sha&amp;nbsp;=&amp;nbsp;MessageDigest.getInstance(&amp;quot;SHA&amp;quot;);//获取SHA实例，环境不支持会报错
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(Exception&amp;nbsp;e)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(e.toString());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.printStackTrace();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&amp;quot;&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte[]&amp;nbsp;byteArray&amp;nbsp;=&amp;nbsp;inStr.getBytes(&amp;quot;UTF-8&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte[]&amp;nbsp;md5Bytes&amp;nbsp;=&amp;nbsp;sha.digest(byteArray);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuffer&amp;nbsp;hexValue&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StringBuffer();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;md5Bytes.length;&amp;nbsp;i++)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;val&amp;nbsp;=&amp;nbsp;((int)&amp;nbsp;md5Bytes[i])&amp;nbsp;&amp;amp;&amp;nbsp;0xff;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(val&amp;nbsp;&amp;lt;&amp;nbsp;16)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hexValue.append(&amp;quot;0&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hexValue.append(Integer.toHexString(val));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;hexValue.toString();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;main(String&amp;nbsp;args[])&amp;nbsp;throws&amp;nbsp;Exception&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;str&amp;nbsp;=&amp;nbsp;&amp;quot;www.yangguangdream.com&amp;quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;source：&amp;quot;&amp;nbsp;+&amp;nbsp;str);//source：www.yangguangdream.com
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&amp;quot;sha：&amp;quot;&amp;nbsp;+&amp;nbsp;shaEncode(str));//sha：64a687b0966d568fc893646492743ec268d9ecde
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

}&lt;/pre&gt;&lt;p&gt;使用&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-java&quot;&gt;String&amp;nbsp;shaStr&amp;nbsp;=&amp;nbsp;Sha1Utils.shaEncode(token);&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 19 Sep 2025 16:28:27 +0800</pubDate></item></channel></rss>