本文中采用的代碼示例都為javaScript代碼
最近在刷一些javaScript的相關題目,過程中一個坑爹的細節(jié)問題讓我很無語,代碼如下:
let num_1 = 0.8;
let num_2 = 0.2;
console.log(num_1 - num_2 === 0.6);//false
之前自己對數(shù)據(jù)類型這一塊沒有整體的理解,無論是什么編程語言,計算機處理數(shù)據(jù)所使用二進制01代碼無法準確表示某些帶小數(shù)位的十進制數(shù)據(jù)。
整數(shù)部分轉(zhuǎn)換成二進制是“除二取余”法。
小數(shù)部分轉(zhuǎn)換成二進制是"乘二取整"法。
(0.65)10 = (0.101001100110011001100110011001100110011......)2
即二進制代碼在現(xiàn)有精度(float - 32位,double - 64位)無法正確表示0.65這個數(shù)據(jù)。
想要避免這樣的問題,可以采用以下一些方式規(guī)避:
- 將數(shù)據(jù)乘以10或者100變成整數(shù),做完整數(shù)運算再除以10或者100
let num_1 = 0.8;
let num_2 = 0.2;
console.log((num_1 * 10 - num_2 * 10) / 10 === 0.6 ); //true
或者利用數(shù)學函數(shù),四舍五入成為整數(shù)
console.log(Math.round((num_1 - num_2) * 10) / 10);//true
- 通過截取有效的小數(shù)位,設置指定數(shù)值精度
let num_1 = 0.8;
let num_2 = 0.2;
let result = num_1 - num_2;
console.log(result.toFixed(1) === 0.6);//true
目前可以想到的實現(xiàn)就這兩種,如果大家還有什么好的解決實現(xiàn)方案可以交流!