JS数字转货币问题实录:前端金额格式化这些坑你踩了几个

做前端这几年,"数字转货币"这需求我怕是写了不下百遍。后台传来一个 1234567,页面上得显示成 ¥1,234,567.00,看着简单数字转货币问题js,真写起来坑一箩筐。四舍五入规则、小数位补零、千分位分隔、负号位置,哪样不对用户就觉得"这页面不专业"。我把踩过的坑全摊开来说。

toFixed(2) 是最常见的偷懒写法,但它的舍入规则并非简单的"四舍五入",0.15.toFixed(2) 出来是 "0.15" 而非 "0.16",1.005.toFixed(2) 直接给你 "1.00"。底层 IEEE 754 浮点表示决定了你没法靠 toFixed 兜住精度。千分位用正则 replace 能跑,碰上 1e21 这种大数直接废。

javascript toFixed precision issue_数字转货币问题js_formatCurrency js

金额超过 2^53 时,JS 的 Number 类型丢精度,10000000000000001 存进去就变成 10000000000000000。银行系统、电商订单金额动辄上亿,拿 Number 存根本不行。我后来的习惯是后端一律返回"分"为单位的整数JS数字转货币问题实录:前端金额格式化这些坑你踩了几个,前端用 bigint 或字符串接收,展示层再除以 100 做格式化,从根上绕开浮点问题。

真要写个通用的 formatCurrency 函数,我会拆成三步:取绝对值处理整数部分做千分位,单独处理小数部分 padStart 补零,负号统一放最前面。或者干脆上 big.js 这类轻量库,三行搞定,比手写正则省心。别在业务代码里堆 if-else 凑格式,抽一个工具函数全项目统一调用,后续改币种符号、小数位数都只动一处。