html如何只取小数点后两位小数

4次阅读

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

html如何只取小数点后两位小数

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 类型,对 nullundefined、字符串数字会报错或返回意外结果
  • 不处理科学计数法输入,如 1e-7.toFixed(2)"0.00",但可能掩盖精度丢失
  • IE8 及更早版本不支持,现代项目基本不用考虑

CSS 中显示两位小数?不行,得靠 js 或后端格式化

CSS 没有控制数字小数位的功能。text-alignfont-size 这些跟格式无关;content 伪元素也不能动态计算数值。所有「页面上显示 xx.xx 元」的需求,必须在 JS 渲染时处理,或由后端吐出已格式化的字符串。

容易踩的坑:在 Vue/React 模板里写 {{ price.toFixed(2) }} 看似方便,但如果 pricenull"",运行时就崩。得加保护:

立即学习前端免费学习笔记(深入)”;

{{ 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">,否则用户输入会被浏览器拒绝。

text=ZqhQzanResources