高端网站建站 北京百度竞价排名事件
高端网站建站 北京,百度竞价排名事件,建立的英语,怎么自己写网页点赞 关注 收藏 学会了
在做前端开发或者使用 n8n、dify 等工具时可能会跟数字打交道#xff0c;可能会遇到下面这些需求#xff1a;
显示金额#xff1a;1234567.89 → 1,234,567.89金额计算#xff1a;0.1 0.2超大 ID#xff1a;9007199254740993阿拉伯数字转中文…点赞 关注 收藏 学会了在做前端开发或者使用 n8n、dify 等工具时可能会跟数字打交道可能会遇到下面这些需求显示金额1234567.89 → 1,234,567.89金额计算0.1 0.2超大 ID9007199254740993阿拉伯数字转中文金额123456.78 → 壹拾贰万叁仟肆佰伍拾陆元柒角捌分很多刚接触 JavaScript 的开发者会直接使用Number类型处理这些问题但实际上这里面隐藏了不少坑。举个例子如果后端传给你的 JSON 里的长 ID 没加引号前端在JSON.parse的一瞬间就已经把精度丢了。constrawJson{id: 9007199254740995};constparsedJSON.parse(rawJson);console.log(parsed.id.toString());// 9007199254740996 精度丢失了解决方案后端改 String最省心的办法。让后端把超长 ID 以字符串形式下发。前端插件如果后端不改你可以使用json-bigint库来解析原始的 JSON 字符串。数值是否安全在实际应用中可以通过一些方法来胖段当前数值是否安全。JS 提供的方法Number.isSafeInteger(9007199254740991)// trueNumber.isSafeInteger(9007199254740992)// false处理大数值的几种方案在 JavaScript 里普通数字类型是Number64位双精度浮点它有一个安全整数范围最大安全整数Number.MAX_SAFE_INTEGER9007199254740991最小安全整数Number.MIN_SAFE_INTEGER-9007199254740991超过这个范围就会出现精度丢失问题例如console.log(90071992547409911)// 9007199254740992console.log(90071992547409912)// 9007199254740992 ❌ 精度丢失如果你要处理超过 Number 最大安全值的整数有几种常见方案方案1BigInt现代 JavaScript 提供了一种新的类型BigInt。它可以表示任意大的整数。constnumBigInt(9007199254740993)console.log(num1n)// 9007199254740994n用BigInt的话数字后面会跟着一个字母n看到它就能区分这个值和普通的Number类型不一样这个需求可能会涉及很大的数值。它还有一种简写方法在赋值的时候不需要加引号括者数字而是在数字后面加个n。const num 9007199254740993n需要注意的是BigInt 不能和 Number 混合运算1n1// ❌ 报错必须统一类型1nBigInt(1)金融计算为什么不能直接用 Number一个经典问题0.10.2# 结果是0.30000000000000004原因是浮点数精度问题。金融系统一般有两种解决方案。方案一金额用“分”存储例如123.45元 存储为12345分前端展示时再除以 100。constamount12345/100console.log(amount)// 123.45这种方式是比较老派的方法。方案二使用大数库**MikeMcl 写了几个很出名的处理数字的JS库比如bignumber.jshttps://github.com/MikeMcl/bignumber.jsdecimal.jshttps://github.com/MikeMcl/decimal.jsbig.jshttps://github.com/MikeMcl/big.js我用bignumber.js演示一下。安装bignumber.jsnpminstallbignumber.js在前端项目里引入importBigNumberfrombignumber.js;此时直接计算小数位的数值constanewBigNumber(0.1)constbnewBigNumber(0.2)a.plus(b).toString()// 0.3// 格式化保留2位小数a.plus(b).toFormat(2)// 0.30处理数值比较大的数据也没问题// 1. 创建大数建议始终传入字符串constxnewBigNumber(9007199254740995.123456789);constynewBigNumber(100);// 2. 加减乘除constresx.plus(y);// 加constres2x.minus(y);// 减constres3x.times(y);// 乘constres4x.div(y);// 除console.log(res.toString());// 9007199254741095.123456789 (精度完全保留)格式化数值在金融行业金额的展示不仅关乎美观更关乎准确性和合规性。针对你提出的千分位转换、中文大写转换以及大数处理千分位格式化方案1toLocaleString()JavaScript 原生支持国际化格式化。constamount123456789.56amount.toLocaleString()// 123,456,789.56方案2Intl.NumberFormat金融项目比较推荐使用这个方案。constformatternewIntl.NumberFormat(zh-CN,{minimumFractionDigits:2,maximumFractionDigits:2})console.log(formatter.format(1234567.8))// 1,234,567.80如果想在金额前面加一个“钱”的符号比如人民币就加个¥可以这么写constformatternewIntl.NumberFormat(zh-CN,{style:currency,currency:CNY})console.log(formatter.format(123456))// ¥123,456.00如果要使用美元符$就这么写constformatternewIntl.NumberFormat(en-US,{style:currency,currency:USD})console.log(formatter.format(123456))// $123,456.00方案3正则实现千分位不推荐functionformatNumber(num){returnnum.toString().replace(/\B(?(\d{3})(?!\d))/g,,)}console.log(formatNumber(123456789))// 123,456,789如果需要支持小数就这么写functionformatMoney(num){returnnum.toString().replace(/\d/,function(n){returnn.replace(/(\d)(?(\d{3})$)/g,$1,)})}但金融系统一般不推荐这种方式因为这种方式不支持国际化不支持货币格式容易出 bug。数字转大写中文在中文的金融系统中经常需要展示123456.78 ↓ 壹拾贰万叁仟肆佰伍拾陆元柒角捌分这个规则有点复杂一般不建议自己实现。我推荐使用开源库nzhhttps://github.com/cnwhy/nzh。安装npminstallnzh使用import nzh from nzh nzh.cn.encodeS(123456) // 十二万三千四百五十六 nzh.cn.encodeB(123456.78) // 壹拾贰万叁仟肆佰伍拾陆点柒捌 nzh.cn.toMoney(123456.78) // 人民币壹拾贰万叁仟肆佰伍拾陆元柒角捌分最后总结一下。在 JavaScript 中处理金额和大数时核心要记住三点1️⃣不要直接用 Number 做金融计算2️⃣金额存储最好使用整数分3️⃣展示时再进行格式化只要遵循这三条原则就可以避免绝大多数金额相关的 bug。以上就是本文的全部内容了还有疑问的话可以在评论区交流。点赞 关注 收藏 学会了