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); }}

相關文章
相關標籤/搜索