tofixed方法的bug之解决方法

author author     2022-08-08     338

关键词:

最近在工作过程中碰到一个隐藏的bug,经调试发现竟然是toFixed函数不可靠的结果引起的。后端同学在处理价格比较的时候,用foFixed进行价格的四舍五入之后,竟然发现比较的结果有问题;

大家都知道,Number类型的变量有个toFixed方法,该方法将Number四舍五入为指定小数位数的数字,以字符串返回。

IE:

0.6 .toFixed(0); // 0
1.6 .toFixed(0); // 2

Chrome:

0.6 .toFixed(0); // 1
1.6 .toFixed(0); // 2

另外还发现,就算是同在Chrome里,四舍五入也不靠谱:

( 0.035 ).toFixed( 2 ); // 0.04
( 0.045 ).toFixed( 2 ); // 0.04

这次IE倒是靠谱了:

( 0.035 ).toFixed( 2 ); // 0.04
( 0.045 ).toFixed( 2 ); // 0.05

结论 :toFixed()函数靠不住,如果有需要精确控制的情况,还是自己写个方法比较好。比如:

function toFixed(number, decimal) {
	decimal = decimal || 0;
	var s = String(number);
	var decimalIndex = s.indexOf(‘.‘);
	if (decimalIndex < 0) {
		var fraction = ‘‘;
		for (var i = 0; i < decimal; i++) {
			fraction += ‘0‘;
		}
		return s + ‘.‘ + fraction;
	}
	var numDigits = s.length - 1 - decimalIndex;
	if (numDigits <= decimal) {
		var fraction = ‘‘;
		for (var i = 0; i < decimal - numDigits; i++) {
			fraction += ‘0‘;
		}
		return s + fraction;
	}
	var digits = s.split(‘‘);
	var pos = decimalIndex + decimal;
	var roundDigit = digits[pos + 1];
	if (roundDigit > 4) {
		//跳过小数点
		if (pos == decimalIndex) {
			--pos;
		}
		digits[pos] = Number(digits[pos] || 0) + 1;
		//循环进位
		while (digits[pos] == 10) {
			digits[pos] = 0;
			--pos;
			if (pos == decimalIndex) {
				--pos;
			}
			digits[pos] = Number(digits[pos] || 0) + 1;
		}
	}
	//避免包含末尾的.符号
	if (decimal == 0) {
		decimal--;
	}
	return digits.slice(0, decimalIndex + decimal + 1).join(‘‘);
}
var a = 19.02
var b = 209.01
// 结果
console.log(toFixed(a, 2)); //==> 19.02
console.log(toFixed(b, 2)); //==> 209.01
console.log(Number(toFixed(a, 2)) < Number(toFixed(b, 2))); //==> true

tofixed不能四舍五入问题

...因是js在处理0.005的时候直接舍去了千分位,直接上解决方法 Number.prototype.toFixed=function(s)varchangenum=(parseInt(this*Math.pow(10,s)+0.5)/Math.pow(10,s)).toString();index=changen 查看详情

bootstrap-table操作之“删除”

...图所示:下面我来描述一下实现过程中出现的bug以及解决方法:1、href值为空(href=""):bug:点击“删除”时一直刷新本页面解决方法:赋值href="javascript:;"2、onclick点击事件:del()bug:点击“删除”时报错:delisnotdefined解决方法:... 查看详情

jquery之attr()与prop()方法

一、Prop()的由来  JQuery1.6开始新增方法prop()  prop()解决:表单元素中checked,selected,disabled等属性在方法attr()中可能会出现的不一致问题(属于attr方法之前的bug);  [引用文献]https://segmentfault.com/a/1190000002680303 二、BUG重现<... 查看详情

控制小数位数(代码片段)

这篇文章就是记录一下自己写的一个方法。方法说明该方法主要是对toFixed方法的一个改写,因为toFixed方法在实际使用的过程中是有bug的,具体可以参考JS中浮点数精度问题。下面是方法的一些说明:/***控制数字的小数位,以及... 查看详情

tofixed()方法

1.定义toFixed()方法可把Number四舍五入为指定小数位数的数字。 2.示例Showthenumber13.37withonedecimal:<scripttype="text/javascript">    varnum=newNumber(13.37);    document.write(num.toFixed(1))</script>  查看详情

20年目睹之怪bug

...点好了),或者也可以看这里iOS13发布后,UIImage有一个新增方法imageWithTintColor:,可以改变图片的颜色有一些三方库的类扩展比如UIImage+Additions可能覆盖了这个方法,导致出现这种系统icon出现灰色边框的现象,删掉这些方法就可以了UDID... 查看详情

js四舍五入不显示.00

...四舍六入五成双最后为零不显示2023-01-11JS013.重写toFixed()方法,toFixed()原理-四舍五入?银行家舍入法?No!六舍七允许四舍五入√!JStoFixed四舍六入五成双C#采用的是“四舍六入五成双”、上取整、下取整四舍六入五成双银行家算... 查看详情

ie6浏览器的bug问题及相关解决的方法

IE6浏览器的bug问题及相关解决的方法1、css浮动边距加倍错误(双倍边距BUG)的解决办法   该错误只影响ie而不影响其他浏览器,我们可以考虑用hack来解决!!!  解决方法:_display:inline; 2、扩展框问题 ... 查看详情

图片向下撑大3px的bug有哪些解决方法

方法一:给图片添加vertical-align:bottom;方法二:给图片添加display:block;方法三:给图片添加浮动(记得给图片的父元素增加高度)方法四:给body或者图片的父元素添加font-size:0; 查看详情

解决xcode7.3的一个bug的方法

...来百度了,但是都没有解决,然后综合了一下,解决了。方法:首先点击桌面找到前往-->然后选择前往文件夹然后复制这句话 /Users/用户名/Library/Developer/Xcode/DerivedData然后删掉这个文件夹下的缓存文件最后Command+shift+k清除... 查看详情

测试报告alpha

...获取到token,而获取token和调用api都需要新开一个线程,解决方法为通过加锁来解决线程安全问题遇到了页面的适配问题,在不同的手机上显示的页面差距非常大,解决方法为替换为根据不同屏幕自动调整的relativelayout布局.动态下滑刷... 查看详情

为啥javascript小数相减会出现一长串的小数位数?

...是太难看了javascript:document.write((11.3-10.1).toFixed(2))toFixed()方法不仅仅截去多余的小数位,同时它还根据截取位置的下一个小数位进行四舍五入。例如,对于数值10.739,截取到小数点后的两位数,结果将是10.74。而对于数值10.732,截... 查看详情

js中hover事件时候的bug以及解决方法

...现有一个BUg,比如,你移动到一个元素上,让它执行一个方法,然后你快速的移入移出的时候,他会进行亮瞎你眼睛的频闪效果,而且跟得了老年痴呆一样会进行延时显示,24K钛合金也会被闪瞎的,鼠标重复在相应区域滑动的时... 查看详情

bug集合及其解决方法

点击查看原文1、java.lang.IllegalStateException:ExpectedastringbutwasBEGIN_ARRAYatline1column278解决:接口数据格式与实体类数据格式不一样2、java.lang.RuntimeException:UnabletostartactivityComponentInfo{com.wangll.activity/com.wang 查看详情

swipemenulistview在scrollview里上下滑动导致菜单不能显示完全的bug解决方法

这是因为上下滑动的时候,事件被ScrollView截获了,这时候应该禁止ScrollView截获上下滑动事件,解决方法如下publicclassNoRollSwipeMenuListViewextendsSwipeMenuListView{privateGestureDetectormGestureDetector;publicNoRollSwipeMenuListView(Contextcont 查看详情

session有什么重大bug,有什么方法可以解决

【考点】ASP.NET中Session的多种保存方法。【出现频率】★★★☆☆【解答】使用进程内会话状态模式时,如果aspnet_wp.exe或应用程序域重新启动,则会话状态数据将丢失。可以用Sateserver或SQLServer数据库的方式存储Session的名称/值对... 查看详情

js处理数据四舍五入(tofixed与round的区别详解)

1、tofixed方法toFixed()方法可把Number四舍五入为指定小数位数的数字。例如将数据Num保留2位小数,则表示为:toFixed(Num);但是其四舍五入的规则与数学中的规则不同,使用的是银行家舍入规则,银行家舍入:所谓银行家舍入法,其... 查看详情

margin中的bug解决方法

...元素中使用margin-top:50px;父子元素都会跑出50px, 解决方法:  在父元素中使用下面三种任意一种都可以。  方法一:给父元素加边框  border:1pxsolid#0086b3  方法二:溢出隐藏  overflow:hidden;  方法三:加一个&nbs... 查看详情