javascript中float類型計算的精確度問題

在平時的使用過程當中,發現使用float類型在進行計算的時候,有些數字在進行計算後,小數點後面的位數明顯變多,而且最後一位不爲零,和正常的計算結果產生了偏差。首先看一下個人代碼。javascript

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>求和</title>
		
	</head>
	<body>
		<input type="text" id="add1" value="" />
		<input type="text" id="add2" value="" />
		<input type="button" id="add3" value="add" onclick="add()"/>
		<script type="text/javascript">
			function add(){
				var a1 = document.getElementById('add1').value;
				var a2 = document.getElementById('add2').value;
				if(isNaN(a1)||isNaN(a2)){
					alert('非法的數據類型')//非法數據類型報錯
				}
				else{
					var num = parseFloat(a1)+parseFloat(a2);//相加
					alert(num);	//彈出結果
				}
				
			}
		</script>
	</body>
</html>
運行代碼能夠發現,有一部分數字的計算是沒有問題的,可是當我輸入1.1和2.2而後相加的時候發現結果變成了3.30000000003(不知道幾個0,隨便寫了幾個)。而後我發現問題後在百度搜索答案。

找到一段解釋以下,可是我的以爲解釋的不是很好。html

(非原創)在JavsScript中,變量在存儲時並不區分number和float類型,而是統一按float存儲。而javascript使用IEEE 754-2008 標準定義的64bit浮點格式存儲number,按照IEEE 754的定義:decimal64對應的整形部分長度爲10,小數部分長度爲16,因此默認的計算結果爲「7.0000000000000001」,如最後一個小數爲0,則取1做爲有效數字標誌。java


解決方法:一、在計算結果後限制小數點後的位數,以個人代碼爲例。函數

var num = (parseFloat(a1)+parseFloat(a2)).toFixed(5);//保留小數點後五位

二、重寫浮點計算的函數

//加法函數,用來獲得精確的加法結果
//說明:javascript的加法結果會有偏差,在兩個浮點數相加的時候會比較明顯。這個函數返回較爲精確的加法結果。
//調用:accAdd(arg1,arg2)
//返回值:arg1加上arg2的精確結果
function accAdd(arg1, arg2) {
    var r1, r2, m;
    try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
    try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
    m = Math.pow(10, Math.max(r1, r2))
    return (arg1 * m + arg2 * m) / m
}
相關文章
相關標籤/搜索