记一次关于计算金额精度问题
分析出现问题的情况
校验两个金额的值大于,小于,等于的时候由于精度失真导致,没法得到想要结果 ;eg 1005.05 元与 1004.999996 元这种失精度 ;其实我们需要的是精确到两位有效数字元就可以了,但是在计算的过程中使用parseFloat()函数会出现这种1004.999996 数据
parseFloat函数介绍
介绍: parseFloat() 函数可解析一个字符串,并返回一个浮点数。
它的语法是:parseFloat(string);
注释:1 只有字符串中的第一个数字会被返回,开头和结尾的空格是允许的。
2 如果字符串的第一个字符不能被转换为数字,那么 parseFloat() 会返回 NaN,如果只想解析数字的整数部分,请使用 parseInt() 方法。
最近总结解决的方法
1使用toFixed函数来精确
1.1toFixed函数定义和用法
toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。
语法
NumberObject.toFixed(num)
参数 描述
num 必需。规定小数的位数,是 0 ~ 20 之间的值,包括 0 和 20,有些实现可以支持更大的数值范围。如果省略了该参数,将用 0 代替。
注:
返回 NumberObject 的字符串表示,不采用指数计数法,小数点后有固定的 num 位数字。如果必要,该数字会被舍入,也可以用 0 补足,以便它达到指定的长度。如果 num 大于 le+21,则该方法只调用 NumberObject.toString(),返回采用指数计数法表示的字符串。
抛出
当 num 太小或太大时抛出异常 RangeError。0 ~ 20 之间的值不会引发该异常。有些实现支持更大范围或更小范围内的值。
当调用该方法的对象不是 Number 时抛出 TypeError 异常。
1.2使用
var amount = parseFloat(Sum+Sum2 ).toFixed(4);//四舍五入保留小数点后四位
2使用扩大一定的倍数,对结果在缩小这个倍数
var num1=parseFloat(“234432.9”)*1000000000000;
var num2=parseFloat(“0.2”)*1000000000000;
var num3=(num1-num2)/1000000000000;
结果为 234432.7