js 浮點數加減總結

2022-03-25 13:20:08 字數 2673 閱讀 1196

說明

眾所周知,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的...