說明眾所周知,js在計算浮點數時候,結果可能會不準確。比如:(在chrome中的運算結果)
2.2 + 2.1 = 4.300000000000001
2.2 - 1.9 = 0.30000000000000027
2.2 * 2.2 = 4.840000000000001
2.1 / 0.3 = 7.000000000000001
網上流傳的**(有bug)
網上流傳的優化後的**如下(有問題的**,請勿使用)
function add(a, b) catch (f)
try catch (f)
return e = math.pow(10, math.max(c, d)), (a * e + b * e) / e;
}function sub(a, b) catch (f)
try catch (f)
return e = math.pow(10, math.max(c, d)), (a * e - b * e) / e;
}function mul(a, b) catch (f) {}
try catch (f) {}
return number(d.replace(".", "")) * number(e.replace(".", "")) / math.pow(10, c);
}function div(a, b) catch (g) {}
try catch (g) {}
return c = number(a.tostring().replace(".", "")), d = number(b.tostring().replace(".", "")), c / d * math.pow(10, f - e);}1
2345
6789
1011
1213
1415
1617
1819
2021
2223
2425
2627
2829
3031
3233
3435
3637
3839
4041
4243
4445
4647
4849
5051
5253
54原理就是將浮點數轉化為整數來計算。
問題**測試
但是上面的優化方法真的解決問題了嗎,我們可以簡單做下測試。
測試**如下:(測試運算中加法)
function test()
settimeout(function() , 10);
}test();12
3456
78910
1112
13問題**測試結果
瀏覽器控制台很快就列印了結果,說明被測試的加法運算**存在運算不準確的問題。
測試執行結果:
問題**出錯原因
既然上面的**有問題,那麼出錯的點在**,我們就以計算錯誤的數字來除錯**。
被加數:19.36 加數:601.19 結果:620.5500000000001
除錯的過程及結果如下:
我們發現原來是其中的乘法計算錯誤。
修正方法
網上有一些版本你會發現在最終返回結果的時候加上了tofixed,這是一種解決方法。
另外既然是乘法出錯,我們何不將乘法換成優化後的乘法了。比如修改後的加法如下:
function add(a, b) catch (f)
try catch (f)
return e = math.pow(10, math.max(c, d)), (mul(a, e) + mul(b, e)) / e;}1
2345
6789
1011
1213
14然後用上面的方法進行測試,等了」一天「,控制台也沒列印了。說明這次真的把問題解決了。
最終版(正確版)
function add(a, b) catch (f)
try catch (f)
return e = math.pow(10, math.max(c, d)), (mul(a, e) + mul(b, e)) / e;
}function sub(a, b) catch (f)
try catch (f)
return e = math.pow(10, math.max(c, d)), (mul(a, e) - mul(b, e)) / e;
}function mul(a, b) catch (f) {}
try catch (f) {}
return number(d.replace(".", "")) * number(e.replace(".", "")) / math.pow(10, c);
}function div(a, b) catch (g) {}
try catch (g) {}
return c = number(a.tostring().replace(".", "")), d = number(b.tostring().replace(".", "")), mul(c / d, math.pow(10, f - e));
}---------------------
原文:
浮點數的加減計算總結
本篇後面計算部分待糾正。因為右移時是否採用捨入的策略,需要仔細考量。不特別提出,是不是右移時簡單的截斷即可?update 研究了其他習題的做法,不強調右移時如何捨入時,直接丟掉,算術右移,丟失精度。在補碼移位中,有左零右一的說法,即左移 低位補0,右移 高位補1.首先要說的是 浮點運算中的下溢指的是...
浮點數除錯總結
除錯介紹 硬體平台 powerpc5247 軟體平台 vxworks 使用語言 c語言 錯誤總結 1 在生成任務時,如果在任務中使用浮點計算,一定需要將任務的標誌vx fp task設定,否則將會出錯,主要在其他任務 現0 0錯誤 產生原因 沒有設定浮點計算標識,進入任務執行沒有在進入任務時儲存浮點...
js浮點數的計算
js在計算浮點數時可能不夠準確,會產生捨入誤差的問題,這是使用基於ieee745數值的浮點計算的通病,並非ecmascript一家,其他使用相同數值格式的語言也存在這個問題。這裡講一下js浮點數加 減 乘 除的正確做法。整數的乘法運算是準確的,這裡我們將浮點數的乘法運算轉化為整數乘法,然後除以10的...