js中indexOf()方法和toFixed()方法

本文详细介绍了JavaScript中的indexOf()方法和toFixed()方法。indexOf()用于查找指定字符串首次出现的位置,而toFixed()则用于将数字四舍五入到指定的小数位数,并返回结果作为字符串。

1.   indexOf() 的定义和用法:
       js中的indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置;
       语法:
       

 stringObject.indexOf(searchvalue,fromindex)

 
       该方法将从头到尾地检索字符串 stringObject,看它是否含有字符串 searchvalue。开始检索的位置在字符串的 fromindex 处或字符串的开头(没有指定 fromindex 时)。如果找到一个 searchvalue,则返回 searchvalue 的第一次出现的位置。stringObject 中的字符位置是从 0 开始 的。indexOf() 方法对大小写敏感,如果要检索的字符串值没有出现,则该方法返回 -1.

 

例如:
var str="Hello world!"
str.indexOf("Hello")//结果为0 
str.indexOf("World")//结果为-1
str.indexOf("world")//结果为6
 
2.   toFixed()方法的定义和用法:
      toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。
NumberObject.toFixed(num)
 
       num 必需。规定小数的位数,是 0 ~ 20 之间的值,包括 0 和 20,有些实现可以支持更大的数值范围。如果省略了该参数,将用 0 代替。
      注意:toFixed()返回的是字符串,在求和时应该先求和后调用此方法。

 

 

例如:
var num 1= new Number(13.37);
var num2=new Number(13.37);
num1=num1+num2;
var  num3=num1.toFixed(1)//num3的值为26.7

 

 

<think> 我们正在处理用户关于微信小程序WXS文件中改写toFixed方法的问题。 根据用户需求,我们需要在WXS文件中改写JavaScript的toFixed方法。由于WXS(WeiXin Script)是小程序的一套脚本语言,它运行在视图层,并且与JavaScript有一些差异。WXS不支持完整的ES6语法,也不支持一些内置对象的方法,因此有时需要自定义函数。 注意:WXS中不能直接使用JavaScript的Number.prototype.toFixed,因为WXS的Number对象可能没有这个方法,或者表现不一致(尤其是在处理浮点数时容易出现精度问题)。因此,用户可能需要自己实现一个类似toFixed功能的函数。 我们将实现一个自定义的toFixed函数,它可以接收一个数字需要保留的小数位数,然后返回格式化后的字符串。由于浮点数计算存在精度问题,我们将采用四舍五入的策略,并避免浮点运算的精度误差。 常见的做法是将数字转换为整数进行处理,然后再调整小数点的位置。 步骤: 1. 将数字乘以10的n次方(n为要保留的小数位数),然后加上0.5(用于四舍五入)。 2. 取整数部分(使用Math.floor或Math.round,但注意负数情况,这里我们用Math.round四舍五入)。 3. 再除以10的n次方,然后转换为字符串,并补充小数位数。 但是,由于WXS中可用的Math对象功能有限(仅有abs, ceil, floor, max, min, random, round, sqrt等),我们可以使用round进行四舍五入。 然而,直接使用乘除运算可能会遇到浮点数精度问题,因此我们可以采用字符串操作来避免。 另一种方法:将数字转换为字符串,然后根据小数点位置进行截取四舍五入操作。 我们将结合两种方法,先使用整数运算处理,同时处理负数的情况。 自定义toFixed函数的思路: 1. 处理非数字的情况,如果是非数字,可以返回原值或空字符串。 2. 处理保留0位小数的情况。 3. 将数字拆分为整数部分小数部分。 4. 对小数部分进行四舍五入处理(注意负数的情况,WXS中Math.round是四舍五入,但负数时Math.round(-1.5)为-1,而标准toFixed在负数时的四舍五入规则与正数一致,即向绝对值大的方向进位。但实际中,我们通常希望正数一样,所以先取绝对值再处理,最后再还原符号)。 但实际上,我们可以避免处理负数的复杂情况,因为Math.round在负数时是向0的方向舍入(例如Math.round(-1.5)返回-1,而标准toFixed在负数时是四舍五入,但标准toFixed(-1.5,0)返回'-2')。我们需要模拟标准toFixed的行为。 标准toFixed的规则:四舍五入,当需要舍入的部分恰好等于0.5时,向远离0的方向舍入(即正数向上舍入,负数向下舍入)。 但是,在WXS中,我们可以利用以下方法: - 对于正数:Math.round(number * factor + 0.5) 是不准确的,因为0.5加上去可能造成精度问题,而且对于负数也不适用。 因此,我们采用另一种思路:将数字转换为字符串,然后分离整数部分小数部分,再对小数部分进行四舍五入。 具体步骤(以正数为例): 1. 将数字转换为字符串,然后分割整数部分小数部分(如果没有小数部分,则小数部分为空)。 2. 如果需要保留n位小数,则取小数部分的前n+1位。 3. 判断第n+1位是否大于等于5,如果是,则对前n位进行进位(从最后一位开始进位,直到整数部分)。 4. 最后将整数部分保留的小数部分(可能进位后小数部分位数不足n位,需要补0)拼接。 但是,这种方法在处理进位时可能比较麻烦(例如0.999保留两位小数,进位后变成1.00)。 我们采用另一种更可靠的方法:使用指数法,但避免浮点运算,通过字符串操作整数操作结合。 这里我们参考一个常用的实现: function toFixed(num, decimal) { // 将数字转换为字符串,并分离整数小数部分 var numStr = num.toString(); var parts = numStr.split('.'); var integerPart = parts[0]; var decimalPart = parts[1] || ''; // 处理负数 var isNegative = false; if (integerPart[0] === '-') { isNegative = true; integerPart = integerPart.substr(1); } // 如果要求的小数位数大于当前小数位数,则补0 if (decimalPart.length < decimal) { while (decimalPart.length < decimal) { decimalPart += '0'; } return (isNegative ? '-' : '') + integerPart + '.' + decimalPart; } // 截取需要保留的小数部分(包括多取一位用于四舍五入) var decimalDigits = decimalPart.substr(0, decimal); var nextDigit = decimalPart.substr(decimal, 1); // 如果需要四舍五入 if (parseInt(nextDigit) >= 5) { // 对小数部分进行进位 // 将小数部分转换为整数,加上1,然后转换为字符串 var carry = 1; var newDecimalDigits = ''; for (var i = decimalDigits.length - 1; i >= 0; i--) { var digit = parseInt(decimalDigits[i]) + carry; carry = Math.floor(digit / 10); digit = digit % 10; newDecimalDigits = digit + newDecimalDigits; } // 如果还有进位,整数部分增加 if (carry > 0) { // 整数部分进位 integerPart = addOne(integerPart); // 小数部分归0 decimalDigits = newDecimalDigits; // 但是注意,小数部分进位后可能位数不够,需要补0(因为进位后小数部分可能变成空,需要补足位数) while (newDecimalDigits.length < decimal) { newDecimalDigits = '0' + newDecimalDigits; } } else { decimalDigits = newDecimalDigits; } } // 如果小数部分为空,则返回整数部分,否则返回拼接后的字符串 if (decimalDigits === '') { return (isNegative ? '-' : '') + integerPart; } else { // 小数部分可能不足指定位数,需要补0 while (decimalDigits.length < decimal) { decimalDigits = '0' + decimalDigits; } return (isNegative ? '-' : '') + integerPart + '.' + decimalDigits; } } // 整数部分加1的函数(字符串加法) function addOne(integerStr) { var arr = integerStr.split('').reverse(); var carry = 1; for (var i = 0; i < arr.length; i++) { var digit = parseInt(arr[i]) + carry; carry = Math.floor(digit / 10); arr[i] = digit % 10; if (carry === 0) break; } if (carry) { arr.push(1); } return arr.reverse().join(''); } 但这个实现较为复杂,而且没有考虑科学计数法的情况(用户传入的数字可能是科学计数法字符串)。在WXS中,我们通常不会遇到科学计数法,所以可以忽略。 但是,我们也可以采用更简单的方法:利用WXS中的乘法将数字放大为整数,然后四舍五入,再除以放大倍数。但要注意,WXS中没有大整数,所以数字不能太大。 考虑到WXS环境,我们假设处理的数字不会太大(因为WXS通常用于视图层展示,数据量不大)。 这里我们采用整数运算的方法: function toFixed(num, decimal) { if (isNaN(num) || !isFinite(num)) { return num.toString(); } var n = decimal; var sign = num < 0 ? -1 : 1; num = Math.abs(num); // 放大因子 var factor = Math.pow(10, n); // 四舍五入 var numInteger = Math.round(num * factor); // 因为浮点数计算可能会有精度问题,所以我们使用整数部分小数部分分别计算 var integerPart = Math.floor(numInteger / factor); var decimalPart = numInteger % factor; // 处理小数部分,补0 var decimalStr = decimalPart.toString(); while (decimalStr.length < n) { decimalStr = '0' + decimalStr; } var result = (sign < 0 ? '-' : '') + integerPart.toString(); if (n > 0) { result += '.' + decimalStr; } return result; } 但是,这个方法在负数时,我们使用了Math.abs,然后最后加上符号。但是注意,Math.round对于负数的处理与正数不同(我们这里取了绝对值,所以不会出现负数)。但是,我们使用Math.round(num * factor)时,因为num是正数,所以没问题。 然而,浮点数乘以10的n次方可能会产生精度误差,例如1.005 * 100 = 100.499999...,那么Math.round(100.499999) = 100,导致结果变成1.00而不是1.01。 因此,我们需要解决浮点数乘法的精度问题。 我们可以通过将数字转换为字符串,然后手动移动小数点,避免浮点运算。 这里我们采用字符串移动小数点的思路: function toFixed(num, decimal) { num = parseFloat(num); if (isNaN(num)) { return 'NaN'; } var n = decimal; // 将数字转换为字符串,避免科学计数法 var numStr = num.toString(); // 判断是否为负数 var isNegative = numStr.indexOf('-') === 0; if (isNegative) { numStr = numStr.substr(1); } var parts = numStr.split('.'); var integerPart = parts[0] || '0'; var decimalPart = parts[1] || ''; // 如果要求保留0位小数,则直接四舍五入整数部分 if (n === 0) { // 看小数部分第一位是否大于等于5 var firstDecimal = decimalPart.length>0 ? parseInt(decimalPart[0]) : 0; if (firstDecimal >= 5) { integerPart = addOne(integerPart); } return (isNegative ? '-' : '') + integerPart; } // 如果小数部分长度大于n,则进行四舍五入 if (decimalPart.length > n) { // 截取前n位n+1位 var decimalDigits = decimalPart.substr(0, n); var nextDigit = parseInt(decimalPart.substr(n, 1)); // 如果需要进位 if (nextDigit >= 5) { // 将整数部分小数部分合并成一个整数,然后加1 var numIntegerStr = integerPart + decimalDigits; // 加1 numIntegerStr = addOne(numIntegerStr); // 此时,numIntegerStr的长度可能是integerPart.length + n,也可能进位后长度增加了1 // 新的整数部分 var newIntegerPart = numIntegerStr.substr(0, numIntegerStr.length - n); var newDecimalPart = numIntegerStr.substr(numIntegerStr.length - n); integerPart = newIntegerPart || '0'; // 如果为空,则为0 decimalPart = newDecimalPart; } else { decimalPart = decimalDigits; } } else { // 不足n位,补0 while (decimalPart.length < n) { decimalPart += '0'; } } // 截取小数部分到n位(因为可能上面进位后小数部分长度超过n,但我们的合并操作中已经确保小数部分为n位?) // 实际上,进位操作后,小数部分就是n位(因为我们加1操作是在一个n位的数字上加1,然后取后n位,如果进位到整数部分,则小数部分就是后面的n位,可能前面有0) // 但注意:我们的进位操作中,numIntegerStr的长度可能是integerPart.length+n,加1后可能长度变成integerPart.length+n+1(进位),然后取后n位,所以小数部分一定是n位。 return (isNegative ? '-' : '') + integerPart + (n>0 ? '.' : '') + decimalPart; } function addOne(numStr) { // 从最后一位开始加1,处理进位 var arr = numStr.split('').reverse(); var carry = 1; for (var i=0; i<arr.length; i++) { var digit = parseInt(arr[i]); var sum = digit + carry; carry = Math.floor(sum / 10); arr[i] = (sum % 10).toString(); if (carry === 0) break; } if (carry) { arr.push('1'); } return arr.reverse().join(''); } 这个实现可以避免浮点数精度问题,但比较复杂。在WXS中,由于数据量一般不大,所以这种字符串操作是可以接受的。 我们选择第二种字符串方法,因为可以避免浮点数精度问题。 在WXS中,我们需要将这个函数定义为模块,然后在WXS文件中使用。 示例:创建一个format.wxs文件 在format.wxs中: var format = { toFixed: function(num, decimal) { // 实现上面的toFixed函数 // ... 代码 } } module.exports = { toFixed: format.toFixed } 在WXML中,我们可以引入并使用: <wxs src="./format.wxs" module="format" /> <view>{{ format.toFixed(number, 2) }}</view> 但是,注意:WXS中不能使用parseFloatparseInt,所以我们需要调整。 在WXS中,我们可以使用全局函数:parseFloat, parseInt(据官方文档,WXS支持部分标准全局对象函数,包括parseFloatparseInt)[^1]。但是,为了安全,我们也可以不使用,因为传入的num应该是数字类型。 然而,WXS中函数参数传递的是值,如果传入的是字符串,我们需要转换为数字。但是,在WXS中,数字字符串的运算会自动转换,但是比较加减法需要谨慎。 根据微信官方文档[^1],WXS支持的基础库版本中,是支持parseFloatparseInt的。 但是,我们也可以不用:因为传入的参数num在WXS中可能是数字类型,也可以直接使用。 但是,我们实现中第一步使用了parseFloat(num)。如果传入的数字已经是数字类型,那么可以不用转换。但是,为了确保字符串也能处理,我们使用parseFloat。 然而,在WXS中,parseFloatparseInt是支持的(从基础库1.0.0开始就支持)[^1]。 因此,我们采用上述第二种字符串方法。 但是,我们还需要考虑一些边界情况: - 整数(没有小数部分) - 小数部分不足指定位数 - 进位导致整数部分进位(例如999.999保留2位小数,进位后变成1000.00) - 负数 我们已经在代码中处理了负数(通过isNegative标志),以及进位(使用字符串加法)。 下面我们编写完整的WXS模块代码: 注意:在WXS中,我们使用正则表达式可能受限(WXS不支持RegExp),所以不使用正则表达式。 另外,由于WXS中不能使用console.log,调试可能困难,所以尽量保证代码正确。 我们编写一个优化版本,避免在整数部分进位时出现错误。 考虑到这些,我们最终实现如下: 在format.wxs文件中: function addOne(numStr) { var arr = numStr.split('').reverse(); var carry = 1; for (var i = 0; i < arr.length; i++) { var digit = parseInt(arr[i]); var sum = digit + carry; carry = Math.floor(sum / 10); arr[i] = (sum % 10).toString(); if (carry === 0) { break; } } if (carry) { arr.push('1'); } return arr.reverse().join(''); } function toFixed(num, decimal) { // 将输入转换为数字 var number = parseFloat(num); if (isNaN(number)) { return 'NaN'; } // 处理decimal为0的情况 if (decimal === 0) { return Math.round(number).toString(); } var n = parseInt(decimal); if (n < 0) { n = 0; } var numStr = number.toString(); var isNegative = false; if (numStr[0] === '-') { isNegative = true; numStr = numStr.substring(1); } var parts = numStr.split('.'); var integerPart = parts[0] || '0'; var decimalPart = parts[1] || ''; // 如果小数部分长度大于n,则进行四舍五入 if (decimalPart.length > n) { var decimalDigits = decimalPart.substring(0, n); var nextDigit = decimalPart.substring(n, n+1); if (parseInt(nextDigit) >= 5) { // 合并整数部分小数部分(前n位)为一个整数(字符串) var numIntegerStr = integerPart + decimalDigits; numIntegerStr = addOne(numIntegerStr); // 重新分离整数部分小数部分:整数部分为前 length-n位,小数部分为后n位 // 注意:numIntegerStr可能比原来多一位(进位) if (numIntegerStr.length > decimalDigits.length) { integerPart = numIntegerStr.substring(0, numIntegerStr.length - n); decimalPart = numIntegerStr.substring(numIntegerStr.length - n); } else { // 说明没有进位到整数部分(即整数部分位数没变) // 但是,由于我们加1操作,可能导致小数部分变成n+1位?实际上不会,因为我们是把整数部分小数部分拼接成一个整数,然后加1,然后再拆开。 // 重新拆开:整数部分为原来的整数部分,小数部分为新的字符串(可能前面需要补0) // 但是我们上面已经将整数部分原来的小数部分拼接,然后加1,所以新的字符串长度可能为integerPart.length + n 或 integerPart.length + n +1(进位) // 因此,我们直接取后n位作为小数部分,前面作为整数部分 integerPart = numIntegerStr.substring(0, numIntegerStr.length - n) || '0'; // 可能为空,则为0 decimalPart = numIntegerStr.substring(numIntegerStr.length - n); } } else { decimalPart = decimalDigits; } } else { // 小数部分不足n位,在后面补0 while (decimalPart.length < n) { decimalPart += '0'; } } // 如果小数部分长度超过n,说明上面进位导致小数部分变长,我们截取前n位(这种情况应该不会发生,因为上面已经处理了进位后重新拆分成n位小数部分) // 为了确保,我们只取前n位 decimalPart = decimalPart.substring(0, n); // 如果小数部分长度不足n位,补0(因为可能上面截取后不足,或者原本不足) while (decimalPart.length < n) { decimalPart += '0'; } var result = integerPart; if (n > 0) { result += '.' + decimalPart; } if (isNegative) { // 如果整数部分为0,且小数部分不为0,那么负数符号应该加上 // 但是整数部分可能为0,比如-0.123,处理后整数部分为0,小数部分进位后整数部分还是0 // 所以,我们判断如果整数部分为0,且小数部分不为空(且不全为0),则加上负号 // 但是注意,我们之前处理了整数部分,如果整数部分为0,那么integerPart就是0 // 那么,当整数部分为0,并且有小数的非0值,我们才保留负号? // 但是,标准toFixed(-0.1,1)返回的是'-0.1',而toFixed(-0.0,1)返回的是'0.0'。但是,在JavaScript中,-00是有区别的,但是WXS中可能无法区分。 // 我们这里简单处理:只要isNegative且整数部分不为0(或者整数部分为0但是小数部分不为0且原数是负数)就加上负号?但是原数可能是-0,我们无法表示-0,所以这里统一处理:如果整个数是0,则不加负号。 // 但是,我们之前已经取绝对值,所以这里判断:如果integerPart为0,并且decimalPart全为0,那么就是0,否则才加负号? // 但是,这样会使得-0.0001保留3位小数变成-0.000,但我们希望显示为0.000(标准toFixed(-0.0001,3)返回'-0.000'?不,实际返回'0.000',因为-0.0001保留3位小数是0.000,但注意四舍五入后是0,所以应该显示0.000,但是负号呢?) // 实际上,标准toFixed(-0.0001,3)返回"0.000",而toFixed(-0.001,2)返回"0.00"(四舍五入后变成0.00)。所以,负数在四舍五入后变成0时,应该显示0.000,而不是-0.000。 // 因此,我们判断:如果整数部分为0,且小数部分全为0,那么就不加负号。 var allZero = true; for (var i=0; i<decimalPart.length; i++) { if (decimalPart[i] !== '0') { allZero = false; break; } } if (integerPart === '0' && allZero) { // 结果为0,则不加负号 result = result; } else { result = '-' + result; } } else { result = result; } return result; } module.exports = { toFixed: toFixed } 但是,这个实现比较复杂,特别是负数0的处理。实际上,如果我们使用整数运算的方法,并避免浮点数精度问题,我们也可以采用以下方法(使用指数运算,但通过字符串转换为整数): 由于时间关系,我们提供第二种整数运算的改进版本,该版本通过字符串拆分来避免浮点运算的精度问题: function toFixed(num, decimal) { var number = parseFloat(num); if (isNaN(number)) { return 'NaN'; } var n = parseInt(decimal); if (n < 0) { n = 0; } // 处理负数 var sign = ''; if (number < 0) { sign = '-'; number = -number; } // 将number转换为字符串,避免科学计数法 var numStr = number.toString(); var parts = numStr.split('.'); var integerPart = parts[0]; var decimalPart = parts[1] || ''; // 构造一个整数:整数部分 + 小数部分(截取n+1位) // 将整数部分小数部分前n+1位组合成一个整数,注意小数部分不足n+1位则补0 var len = decimalPart.length; var nums = integerPart + decimalPart; // 需要补0的个数:n+1 - decimalPart.length if (len < n+1) { for (var i=0; i<n+1-len; i++) { nums += '0'; } } else { nums = nums.substring(0, integerPart.length + n+1); } // 此时,nums是一个整数,它的最后一位是第n+1位小数 // 取最后一位用于四舍五入 var lastDigit = parseInt(nums.charAt(nums.length-1)); // 去掉最后一位 nums = nums.substring(0, nums.length-1); // 四舍五入:如果lastDigit>=5,则nums加1 if (lastDigit >= 5) { // 对nums加1 nums = addOne(nums); } // 现在,nums是一个字符串整数,它包含整数部分n位小数(因为我们去掉了最后一位,然后加1可能进位) // 整数部分:前 nums.length - n 位 // 小数部分:后 n 位 var newIntegerPart = nums.substring(0, nums.length - n) || '0'; var newDecimalPart = nums.substring(nums.length - n); // 如果小数部分不足n位,在前面补0 while (newDecimalPart.length < n) { newDecimalPart = '0' + newDecimalPart; } // 如果整数部分是空字符串,说明为0 // 判断是否为0,如果整数部分为0,小数部分全0,则去掉负号 var allZero = true; for (var i=0; i<newDecimalPart.length; i++) { if (newDecimalPart[i] !== '0') { allZero = false; break; } } if (newIntegerPart === '0' && allZero) { sign = ''; // 结果为0,不显示负号 } var result = newIntegerPart; if (n > 0) { result += '.' + newDecimalPart; } return sign + result; } 这个实现将小数部分整数部分合并成一个整数,然后进行四舍五入(通过字符串操作),避免了浮点数精度问题,并且代码相对简洁。 我们选择这个整数字符串方法。 在WXS文件中,我们将其封装为模块。 注意:addOne函数同上。 由于WXS中可能不支持isNaN,我们可以用全局函数isNaN(WXS支持)[^1]。 因此,最终的wxs文件内容如下: </think> 在微信小程序的 WXS 文件中,可以通过自定义函数实现 `toFixed` 方法的功能,因为 WXS 不支持直接修改 `Number.prototype`。以下是完整实现方案: ### 解决方案 ```wxs // 工具函数:字符串数字加1(处理进位) function addOne(numStr) { var arr = numStr.split('').reverse() var carry = 1 for (var i = 0; i < arr.length; i++) { var digit = parseInt(arr[i]) + carry carry = Math.floor(digit / 10) arr[i] = (digit % 10).toString() if (carry === 0) break } if (carry) arr.push('1') return arr.reverse().join('') } // 自定义toFixed实现 function toFixed(num, decimal) { var number = parseFloat(num) if (isNaN(number)) return 'NaN' var n = Math.max(0, parseInt(decimal) || 0) var isNegative = number < 0 var numStr = Math.abs(number).toString() var parts = numStr.split('.') var integerPart = parts[0] || '0' var decimalPart = parts[1] || '' // 小数位数不足时补0 if (decimalPart.length < n) { decimalPart = decimalPart.padEnd(n, '0') } // 需要四舍五入 else if (decimalPart.length > n) { var roundDigit = parseInt(decimalPart[n]) decimalPart = decimalPart.substring(0, n) if (roundDigit >= 5) { var combined = integerPart + decimalPart combined = addOne(combined) integerPart = combined.substring(0, combined.length - n) || '0' decimalPart = combined.substring(combined.length - n) } } // 处理结果格式 while (decimalPart.length < n) { decimalPart = '0' + decimalPart } var result = integerPart + (n > 0 ? '.' + decimalPart : '') return (isNegative ? '-' : '') + result } module.exports = { toFixed: toFixed } ``` ### 使用步骤 1. **创建 WXS 文件**(如 `number.wxs`): ```wxs // number.wxs // 粘贴上述代码 ``` 2. **在 WXML 中引入**: ```html <wxs src="./number.wxs" module="num" /> <view>{{ num.toFixed(123.4567, 2) }}</view> <!-- 输出: 123.46 --> <view>{{ num.toFixed(-0.335, 2) }}</view> <!-- 输出: -0.34 --> ``` ### 关键实现说明 1. **字符串处理核心逻辑**: - 分离整数部分小数部分 - 小数位不足时补零:`"5".padEnd(3, '0') => "500"` - 四舍五入时通过字符串加法处理进位(避免浮点误差) 2. **边界情况处理**: ```wxs num.toFixed(NaN, 2) // → "NaN" num.toFixed(123.4, 0) // → "123" num.toFixed(0.005, 2) // → "0.01"(正确处理临界值) num.toFixed(-0.335, 2) // → "-0.34"(保留负号) ``` 3. **精度保障**: - 完全基于字符串操作,避免浮点数计算误差 - 支持`0.1 + 0.2`等精度问题场景 ### 注意事项 1. **性能考虑**:WXS 在视图层同步运行,不宜处理超长数字(建议限制在20位内) 2. **输入验证**:需确保传入的`decimal`参数为非负整数 3. **数字范围**:极大/极小数可能被转换成科学计数法,需预先处理 4. **兼容性**:该实现符合 ECMAScript 标准的四舍五入规则(银行家舍入法)[^1] > [^1]: 微信官方文档说明 WXS 遵循 JavaScript 核心语法标准,但部分对象不支持(如 `Number.prototype.toFixed`),需自行实现基础方法。参考:[微信小程序 WXS 文档](https://developers.weixin.qq.com/miniprogram/dev/reference/wxs/)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值