關于JavaScrit的數(shù)值精度問題解決

本文中采用的代碼示例都為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)方案可以交流!
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 背景 在java中float賦值給double,會產(chǎn)生精度問題。 輸出為2.0999999046325684。 小...
    我叫小小強閱讀 19,512評論 2 23
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內(nèi)部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,664評論 18 399
  • double result = 1.0 - 0.9; System.out.println(result);//0...
    Aldeo閱讀 5,317評論 0 5
  • 拒絕反抗,拒絕乞求,威脅,拒絕謾罵,利誘,尋死覓活與死纏爛打。 如果對方要求分手,不論以何種理由,不論你有多愛ta...
    幾何月閱讀 748評論 1 4
  • 你的后背在絞肉機里翻攪著 一層層 一塊塊 越來越薄 血從爆裂的血管中滲雜在表面 暴露于空氣之中 散發(fā)著一股腐臭的氣...
    Shootingl閱讀 198評論 0 1

友情鏈接更多精彩內(nèi)容