关键词:
最近在工作过程中碰到一个隐藏的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... 查看详情