JavaScript 如何保留小数位

在日常做网页开发时,经常会遇到价格计算、统计数据展示的场景,比如电商页面里的商品定价、购物车总金额,或者表单里的体重、身高数据,这些场景大多需要用固定小数位来保证数据统一。但很多人刚接触JavaScript时,会发现直接计算或输出的数字经常出现一串冗余的小数,比如本该显示2位小数的价格,结果变成了9.9900000000001,这其实是数字在计算机里的存储规则导致的,只要用对几个内置方法,就能轻松搞定小数位的保留。

最常用:toFixed() 方法,直接定小数位数

如果是需要严格保留n位小数(比如人民币必须2位),直接用数字自带的toFixed()方法是最方便的。这个方法的逻辑很简单:你给它传一个数字参数,它就会把原数字四舍五入到对应位数,然后返回字符串类型的结果。

JavaScript 如何保留小数位

举个生活化的例子,你买奶茶花了12.5元,结账时需要凑整到2位小数,就可以这样写:let milkTea = 12.5; let finalPrice = milkTea.toFixed(2);,运行后finalPrice会变成"12.50",刚好是符合财务要求的两位小数。再比如计算购物车总金额:3件单价19.9元的商品,总价是19.9 * 3 = 59.7,用toFixed(2)后就变成"59.70",不会出现缺位的情况。

不过要注意,toFixed()返回的是字符串,如果你后续需要用这个数字做计算(比如再叠加其他费用),得先用Number()转成数字,不然会出现字符串拼接的错误,比如59.70 + 10会变成"59.7010",这是新手容易踩的小坑。

怕四舍五入不准?用 Math 对象手动截取

有时候业务场景不允许四舍五入,比如计算商品的实际成本,必须是“只舍不入”,哪怕第三位小数是9,也要直接舍去,这时候toFixed()的四舍五入逻辑就不适用了,得用Math对象的方法手动处理。

举个例子,你计算快递运费,系统算出来的基础运费是23.456元,要求保留2位小数,不能多算一分钱,就需要把第三位的6直接去掉。可以这样写:let freight = 23.456; let fixedFreight = Math.floor(freight * 100) / 100;,原理是先把数字乘以100,变成2345.6,再用Math.floor()取整数2345,最后再除以100,就得到23.45,完全符合“只舍不入”的要求。如果是需要“只入不舍”,哪怕第三位是1也进一位,就用Math.ceil()替换Math.floor()就行,比如把23.451变成23.46。

灵活场景:正则表达式,适配任意小数规则

如果遇到更灵活的需求,比如有时候要保留1位小数,有时候要保留2位,甚至要适配千分位加小数的格式(比如1,234.56),正则表达式会更实用。比如你需要把一串随机数字自动保留2位小数,可以这样写:let num = 1234.5678; let fixedNum = num.toString().match(/^\d+(\.\d{0,2})?/) ? num.toString().match(/^\d+(\.\d{0,2})?/)[0] : num;,运行后会得到"1234.56",不管原数字有多少冗余小数,都会自动截取到前两位有效小数,不会四舍五入,也不需要转换类型。

不管用哪种方法,核心都是先明确业务需求是“四舍五入”“只舍”还是“只入”,再选择对应的工具。只要避开toFixed()返回字符串的小坑,就能轻松应对日常开发里的小数处理需求,不用再被那些奇怪的冗余小数困扰。

上一篇 Java 如何类型转换