使用$.each循环累加输入值时小数丢失问题及解决
解决表格输入框小数累加丢失的问题
我刚看完你的问题,这个小数累加丢失的坑我之前也踩过——核心原因就是本地化数值格式和JavaScript默认解析规则不兼容。
问题原因分析
你用了波兰本地化(pl-PL)来格式化输入框数值,这种格式下:
- 小数分隔符是逗号(
,)而不是JavaScript默认识别的点号(.) - 千位分隔会用空格(比如
1 333,33)
但JavaScript的parseFloat()只能识别点号作为小数分隔符,遇到逗号就会直接截断,只取前面的整数部分,这就是你累加时小数丢失的根本原因。
修正方案
基础修正版(替换逗号为点)
先把输入框值里的逗号替换成点,再用parseFloat解析:
var summaryNetto = 0; var summaryVat = 0; var summary = 0; $('#products > tbody > tr').each(function() { summaryNetto += parseFloat($(this).find('input[name="singlePriceSummaryNetto"]').val().replace(',', '.')); summaryVat += parseFloat($(this).find('input[name="singleVatSummary"]').val().replace(',', '.')); summary += parseFloat($(this).find('input[name="singleSummaryBrutto"]').val().replace(',', '.')); }) console.log('summaryNetto: '+summaryNetto); console.log('summaryVat: '+summaryVat); console.log('summary: '+summary);
波兰本地化加强版(清除空格+替换逗号)
如果你的数值带有千位分隔的空格(比如1 333,33),需要先清除所有空格再替换逗号:
var summaryNetto = 0; var summaryVat = 0; var summary = 0; $('#products > tbody > tr').each(function() { singlePriceSummaryNetto = $(this).find('input[name="singlePriceSummaryNetto"]').val().replace(/\s+/g, ''); summaryNetto += parseFloat(singlePriceSummaryNetto.replace(',','.')); singleVatSummary = $(this).find('input[name="singleVatSummary"]').val().replace(/\s+/g, ''); summaryVat += parseFloat(singleVatSummary.replace(',', '.')); singleSummaryBrutto = $(this).find('input[name="singleSummaryBrutto"]').val().replace(/\s+/g, ''); summary += parseFloat(singleSummaryBrutto.replace(',', '.')); }) $('span#summaryNetto').empty(); $('span#summaryNetto').append(format(summaryNetto) + 'zł'); $('span#summaryVat').empty(); $('span#summaryVat').append(format(summaryVat) + 'zł'); $('span#summary').empty(); $('span#summary').append(format(summary) + 'zł');
额外说明
你的format函数用来展示本地化数值是完全没问题的,但计算时一定要把格式化后的字符串转成JavaScript能识别的标准浮点数格式——也就是替换逗号为点,清除多余空格,这样parseFloat才能正确解析小数部分,累加结果就不会丢失小数了。
内容的提问来源于stack exchange,提问作者flow
相关产品推荐
相关产品推荐

