JS中浮点数相加问题

 

https://blog.csdn.net/u012937029/article/details/61191512 数组

采用IEEE 754 Floating-point的浮点数编码方式来表示浮点数 
按IEEE 754格式保存的浮点数精度至关于带有1五、16或17位小数位数的十进制小数,因为存在二进制和十进制的转换问题,具体的位数会发生变化。要得到最高的转换精度,必须指定17位的小数——此时能够相信前15位的精度 
运算原则 
■ 大多数Web页面不须要小数 避免使用小数,尽可能设法使用整数。确保数组的索引都是整数。按分(而不是元)计算金额。百分比放大100倍计算以免出现小数。尽量不用除法(/)和模(%)运算,由于大多数状况下它们直接致使出现浮点数。若是必须使用除法,当即用Math.round方法回归整数运算。ui

■ 若是必须使用浮点数,则尽量引入冗余小数位——即在程序要求的运算精度以外,再增长小数位 若是程序须要5位数字的小数精度,则在运算中至少保留6位的小数,8位更好。冗余位越多,累计偏差的影响越小。this

■ 避免在同一个表达式中使用相差太大或过小的数值 对两个很是接近的数值执行减法或比较操做很容易出错。将很小的数值和很大数值相加无异于浪费时间,小的数值极可能被看成0。不过,很小的数值乘以很大的数值通常不会出现问题,例如2 * 12345678会获得正确的结果24691356。可是,0.1 - 0.09的结果是0.010000000000000009。编码

■ 用isFinite()和isNaN()检查运算结果 经过表单提交任何数值运算结果以前,必定要先检查数据的合法性。spa

■ 慎用数值运算 程序涉及的数值运算越少,引入偏差的可能就越小。视浮点数为贵客,不可任意驱使。.net

运算 
paeseFloat(string); 
toFixed();prototype

 

result.toFixed(3)*1000/1000;//保留三位小数,而且去掉末尾的0,最后一位会进行四舍五入。blog

 

//加法
Number.prototype.add = function (arg) {
var r1, r2, m;
try {
r1 = this.toString().split(".")[1].length
} catch (e) {
r1 = 0
}
try {
r2 = arg.toString().split(".")[1].length
} catch (e) {
r2 = 0
}
m = Math.pow(10, Math.max(r1, r2))
return (this * m + arg * m) / m
}索引

//减法
Number.prototype.sub = function (arg) {
return this.add(-arg);
}string

//乘法
Number.prototype.mul = function (arg) {
var m = 0, s1 = this.toString(), s2 = arg.toString();
try {
m += s1.split(".")[1].length
} catch (e) { }
try {
m += s2.split(".")[1].length
} catch (e) { }
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
}

//除法Number.prototype.div = function (arg) { var t1 = 0, t2 = 0, r1, r2; try { t1 = this.toString().split(".")[1].length } catch (e) { } try { t2 = arg.toString().split(".")[1].length } catch (e) { } with (Math) { r1 = Number(this.toString().replace(".", "")) r2 = Number(arg.toString().replace(".", "")) return (r1 / r2) * pow(10, t2 - t1); }}

相关文章
相关标签/搜索