浮點數四則運算

項目地址:github.com/wangxiaofei…git

爲什麼浮點數運算時會失精

計算機運算時二進制的,而有些浮點數轉換成二進制的時候是無限循環的,eg: 0.1github

0.1 * 2 = 0.2 # 0
0.2 * 2 = 0.4 # 0
0.4 * 2 = 0.8 # 0
0.8 * 2 = 1.6 # 1
0.6 * 2 = 1.2 # 1
0.2 * 2 = 0.4 # 0
.....
複製代碼

但計算機內存有限,咱們不能用儲存全部的小數位數,達到某個精度點會直接捨棄;有些偏差能夠相互抵消,可是有些就會相互疊加,這就形成了0.1+0.2!=0.3bash

怎麼作

浮點數拆分紅

1.12 => {left: 1, right: 12, length: 2}
1.1 => {left: 1, right: 1, length: 1}
-1.12 => {left: -1, right: -12, length: 2}
複製代碼

兩個數小數位位數同步

1.12 => {left: 1, right: 12, length: 2}
1.1 => {left: 1, right: 10, length: 2}
複製代碼

運算

  1. 加法
  • 整數部分相加
  • 小數部分相加
  • 判斷是否須要進位或者退位(若是小數位相加後的大小大於他們的位數即須要進位)
  • parseFloat
  1. 乘法
  • (l1 + r1) * (l2 + r2) = l1l2 + l1r2 + r1l2 + r1r2
  • 對四部分進行由於運算,好比r1*r2 = 10 * 12 = 120 = 0.012 --> 由於兩位小數和兩位小數相乘後獲得的數是四位小數
  • 對四部分進行相加操做

爲什麼沒有除法

除法自己就有除不盡的時候spa

爲什麼不直接把浮點數直接移位成整數,再運算,在移位回去

這樣作後方法可計算的範圍將大大變小,好比: 假如系統最大運算的數字是整數部分32位,小數部分32位,在這種前提下作加法運算的位數將縮小一半,最大能支持的是小數和整數部分一塊兒是32位的數字。code

相關文章
相關標籤/搜索