tofixed(2)最快但返回字符串且四舍五入有浮点误差,需显式转数字;不适用null/undefined/科学计数法;ie8-不支持;css无法格式化数字;vue/react模板中需加空值和nan防护;截断需手动计算;国际化要注意小数点符号。

JavaScript 用 toFixed(2) 最快,但要注意它返回字符串
直接调用 toFixed(2) 是最常见做法,比如 3.14159.toFixed(2) 得到 "3.14"。它会四舍五入,1.005.toFixed(2) 实际得 "1.00"(不是 "1.01"),这是浮点精度导致的,不是 bug。
常见错误是后续还当数字用:let price = 12.345; console.log(price.toFixed(2) + 1); // "12.341" —— 因为拼了字符串。需要显式转回数字:parseFloat(price.toFixed(2)) 或 Number(price.toFixed(2))。
- 只适用于 Number 类型,对
null、undefined、字符串数字会报错或返回意外结果 - 不处理科学计数法输入,如
1e-7.toFixed(2)得"0.00",但可能掩盖精度丢失 - IE8 及更早版本不支持,现代项目基本不用考虑
CSS 中显示两位小数?不行,得靠 JS 或后端格式化
CSS 没有控制数字小数位的功能。text-align、font-size 这些跟格式无关;content 伪元素也不能动态计算数值。所有「页面上显示 xx.xx 元」的需求,必须在 JS 渲染时处理,或由后端吐出已格式化的字符串。
容易踩的坑:在 Vue/React 模板里写 {{ price.toFixed(2) }} 看似方便,但如果 price 是 null 或 "",运行时就崩。得加保护:
立即学习“前端免费学习笔记(深入)”;
{{ price != null && !isNaN(price) ? parseFloat(price).toFixed(2) : '0.00' }}需要真正截断(非四舍五入)怎么办
toFixed 是四舍五入,如果业务要求「砍掉第三位以后」,比如 3.149 → 3.14,不能依赖它。得手动算:
function truncateToTwo(num) {
return Math.floor(num * 100) / 100;
}注意:Math.floor 对负数向下取整,-3.149 会变 -3.15。如果要统一向零截断,用 Math.trunc(num * 100) / 100。
-
Math.trunc在 IE 不支持,可用num > 0 ? Math.floor(num * 100) : Math.ceil(num * 100)替代 - 依然要防 NaN 和非数字输入,建议先
Number()转换再操作
服务端返回前就该做?看场景
如果所有前端展示都固定两位小数,且数值不参与后续计算(比如纯展示价格),那后端 JSON 直接返回字符串 "19.99" 更省事、更可控。避免前端每个地方都补 toFixed 和容错逻辑。
但若这个值还要用于加减运算(比如购物车合计),后端必须返回原始数字,否则累计误差不可控。这时候前端格式化只是「显示层」的事,原始数据得保持干净。
最容易被忽略的是:不同地区小数点符号(如德语用逗号),toFixed 始终输出英文句点,国际化时别硬塞进 <input type="number">,否则用户输入会被浏览器拒绝。










