拿什么来拯救你 -- 运算精度问题
一 如何做到精确的round运算?
今天在做一个demo的时候,因为生成随机数的关系,需要round一下数值,结果遇到了计算精度的问题:有些round结果是类似32.000004的值。以前在项目里曾经fix过类似的bug,所以今天花了一点功夫来研究如何做到精确的round,特别是在EMCA Script下。
借股沟之能,发现基本上就两种解决思路:
这种做法基本思路就是如下代码:
?
var num = 4.72352337135978971111;alert(num.toFixed(15));?二 问题在哪里?
到这里,各位看官应该明白,在native的primitive number下似乎是不可能做到100%的round的。这可以推广到几乎所有运算。问题根源在哪里?其实很简单,就是数值在计算机中的表示形式。EMCA Script的number,在内部是用IEEE754的浮点数来表示的。这种格式无法避免精度问题,甚至连literal value都不能保证精度,更别提运算结果了。
?
三 出路?其实精度问题也没必要杞人忧天,一般的数字,即使用第一种方法,你也不太会遇到精度问题。我之所以遇到,是因为用了很多随机数(通常小数点后都比较长)。不过你的需求里如果可能涉及到比较复杂的数字计算,就要好好考虑一下精度问题了。
?