1. 程式人生 > >JS無法進行數值精確計算的問題

JS無法進行數值精確計算的問題

在做js浮點型數值計算的時候,出現的了資料計算不準確的原因:

在有限的儲存空間下,絕大部分的十進位制小數都不能用二進位制浮點數來精確表示。例如,0.1 這個簡單的十進位制小數就不能用二進位制浮點數來表示。

console.log( 1 - 0.8 );  //輸出 0.19999999999999996 

console.log( 6 * 0.7 );  //輸出 4.199999999999999 
console.log( 0.1 + 0.2 );  //輸出 0.30000000000000004 
console.log( 0.1 + 0.7 );  //輸出 0.7999999999999999 
console.log( 1.2 / 0.2 );  //輸出 5.999999999999999 

通過上面舉出的例子可以看到,原生的js運算結果不一定準確,會丟失精度。 

解決方案 :將浮點數乘以(擴大)10的n次方倍,把浮點數變為整數後再進行相應的運算,最後將得到的結果除以(縮小)10的n次方倍。

console.log( (1*10 - 0.8*10)/10 );  //輸出 0.2

console.log( 6 * 0.7*10/10 );  //輸出 4.2
console.log( (0.1*10 + 0.2*10)/10 );  //輸出 0.3
console.log( (0.1 *10+ 0.7*10)/10 );  //輸出 0.8 
console.log( 1.2 *10/(0.2 *10) );  //輸出 6 

相關推薦

JS無法進行數值精確計算的問題

在做js浮點型數值計算的時候,出現的了資料計算不準確的原因: 在有限的儲存空間下,絕大部分的十進位制小數都不能用二進位制浮點數來精確表示。例如,0.1 這個簡單的十進位制小數就不能用二進位制浮點數來表示。 console.log( 1 - 0.8 );  //輸出 0.1

JS根據身份證號碼精確計算年齡和性別

def user col .get || info fin ret 得到 1 /** 2 * 根據身份證號得到姓別和精確計算年齡 3 */ 4 function analyzeIDCard(IDCard){ 5 var sexAndAge = {};

JS 關於小數的精確計算

//js 加法計算 //呼叫:accAdd(arg1,arg2) //返回值:arg1加arg2的精確結果 function accAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString().spli

js精確計算

//加法函式,用來得到精確的加法結果 //javascript的加法結果會有誤差,在兩個浮點數相加的時候會比較明顯。這個函式返回較為精確的加法結果。 function accAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toStrin

js精確計算

轉自:https://www.cnblogs.com/yadongliang/p/9067333.html 大多數語言在處理浮點數的時候都會遇到精度問題,但是在JS裡似乎特別嚴重,來看一個例子

js加法和乘法的精確計算

//加法函式,用來得到精確的加法結果 //javascript的加法結果會有誤差,在兩個浮點數相加的時候會比較明顯。這個函式返回較為精確的加法結果。 function accAdd(arg1,arg2){ var r1,r2,m; try{r1=a

Android BigDecimal對包含小數的值進行精確計算

我們平常使用float或者double進行計算時會出現精度丟失的情況,例如:system.out.println(0.06-0.01)得到的結果為0.0499999999999999為什麼會出現這種情況呢?原因在於我們的計算機是二進位制的。浮點數沒有辦法是用二進位制進行精確表

Java中浮點型資料Float和Double進行精確計算的問題

Java中浮點型資料Float和Double進行精確計算的問題 來源  https://www.cnblogs.com/banxian/p/3781130.html   一、浮點計算中發生精度丟失       大概

Java中浮點型數據Float和Double進行精確計算的問題

file 2.4 設置 數據 有一個 對比 科學 單個 做到 Java中浮點型數據Float和Double進行精確計算的問題 來源 https://www.cnblogs.com/banxian/p/3781130.html 一、浮點計算中發生精度丟失 大

js進行金額計算

JavaScript提供了3個顯式的型別轉換函式,分別是eval()、parseInt()和parseFloat()。 eval()函式:將字串表示式轉換成數字值。例如,語句total=eval("432.1*10")的結果是total=4321即將數值4321賦予t

js 精確計算

問題這樣的: 37.5*5.5=206.08 (JS算出來是這樣的一個結果,我四捨五入取兩位小數) 我先懷疑是四捨五入的問題,就直接用JS算了一個結果為:206.08499999999998 怎麼會這樣,兩個只有一位小數的數字相乘,怎麼可能多出這麼小數點出來。 我Google了一下,發現原來這是JavaSc

JavaScirpt精確計算

ava blog rip math 計算 cti logs nbsp var JavaScript精確加法 function accAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString().split("."

vue.js基礎知識篇(3):計算屬性、表單控件綁定

multi option || list text 知識 基礎 unset select標簽 第四章:計算屬性 為了避免過多的邏輯造成模板的臃腫不堪,可使用計算屬性來簡化邏輯。 1.什麽是計算屬性 <!DOCTYPE html><html lang="e

用boost::lexical_cast進行數值轉換

代碼 cout 是我 try 異常 例如 解決 pen value 在STL庫中,我們可以通過stringstream來實現字符串和數字間的轉換: int i = 0; stringstream ss; ss << "123"; ss

[JS]在js進行正則替換顯示高亮處理中,重復替換問題,可以使用js自帶的批量替換,則不會重復替換

數組組合 高亮顯示 log words reg his ucc div == //js高亮顯示 function highlight(){ if($.trim($(‘#pscws‘).val()) != ‘‘){ var url = $("#analys

npm無法進行下載以及報錯的解決方法

Node.js npm報錯 解決辦法這幾天在弄Node.js時用npm安裝一些插件出現如下問題:各種搜索之後終於在Stackflow上找到一個行之有效的方法:npm無法進行下載以及報錯的解決方法

提交form前使用JS進行驗證

this script BE his === false als onkeyup lac html代碼 <form id="myForm" method="post" action="" onsubmit="return check()"> <

無法訪問遠程計算機上的事件查看器?

服務器 Windows Server 如果您無法訪問遠程計算機上的事件查看器,則可能會收到以下錯誤消息:# 1 error Computer <computer_name> cannot be connected. Verify that the network path is corr

java根據生日精確計算年齡

dmi hda 日歷 tac day cat format oid trace 1 package getAge; 2 import java.text.SimpleDateFormat; 3 import java.util.Calendar; 4 import

docker無法進行端口映射

端口 posit virtual mat times response pac mes tina Docker故障故障背景:今天啟動docker容器並進行端口映射時發現報錯,無法進行端口映射了,報錯如下:[root@kvm66 ~]# docker run -d -p 20