亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JS大坑之19位數的Number型精度丟失問題詳解

2024-05-06 16:50:11
字體:
來源:轉載
供稿:網友

More

本項目僅供爬取體驗,每次訪問都會實時爬取數據,所以數據返回速度會比較慢,實際操作應該是定時爬取數據然后將數據存進數據庫,數據從數據庫返回從而提高數據返回效率。

但項目很基礎,可以作為以上各個node模塊最基礎的練手使用,希望可以幫到大家

最近在實現一個需求的時候,需要接入第三方的接口,先調用A接口,A接口返回的數據里,有一個taskId,然后再使用這個taskId請求B接口,獲取最終需要的數據。

后端使用的是node,因此最開始使用的是request-promise這個包請求第三方接口,然而在獲取A接口返回的taskId之后,調用B接口之后,B接口的響應居然是系統錯誤!簡易代碼如下

const rp = require('request-promise')const { taskId } = await rp('https://xxx.com/A')const options = {   method: 'POST',   uri: 'https://xxx.com/B',   body: {    taskId  },   json: true}const result = await rp(options) // {//  "errorcode": "40001",//  "message": "系統錯誤",//  "status": "failed"// }

接著我使用postman請求A接口,獲取新的taskId,再用新的taskId請求B接口,結果卻是正常的!

我在反復檢查代碼,確認請求的參數都是正常的格式之后,一時陷入了無盡的沉思之中。。。

發現

在做了幾次嘗試之后,我發現使用node請求得到的taskId最后兩位數都是0,即1152921504735848700,而使用postman獲取的taskId,則是比較正常的是1152921504735848759,接著我在node控制臺做如下操作

JS,Number,精度丟失

就是這么一瞬間,頓悟了。A接口里的taskId是個19位數字,而request-promise在將數據解析成json時,導致這個19位的數字丟失了精度,查了下資料,發現js的number類型有個最大安全值,即2的53次方(9007199254740992),超過這個值就會出現精度丟失的問題。 Orz

獲取正確的響應數據

由于在一開始使用request-promise包,因此獲取的taskId是丟失了精度了,因此改用了node原生的http模塊發送請求。

const req = https.request('https://xxx.com/A', (res) => {  res.on('data', (chunk) => {  // 由于這里獲取到的響應數據是JSON字符串,因此19位的數字只是字符串的一部分,這時獲取到的taskId就是正確的數字   console.log(`BODY: ${chunk}`);  });  res.on('end', () => {   console.log('No more data in response.');  }) })

雖然獲取到了正常的響應數據,但是這是個JSON字符串,接下來還要把這個字符串解析成JSON,但是用JSON.parse(),又會引起精度丟失的問題,這可真尷尬 Orz

如果這個接口是已方可控的,那么就可以把這個19位數的number轉成字符串,這樣在解析的時候就不會出錯了,但是由于是第三方接口,因此沒法改變。那么最快的解決方案,就是換種編程語言請求啊╮(╯_╰)╭

最后的解決

好吧,最后還是用了node,不過我用了比較硬核的方案實現,先在獲取的JSON字符串中,找到這個19位的數字,然后為它加上引號,這樣再用JSON.parse()解析的時候,就能保持正常的數值,這樣接下的流程就自然通了,代碼如下

let result = '{"taskId":1152921504735848759,"status":"CREATED","progress":0.0,"success":true}'// JSON.parse(result) 不為19位數補上雙引號,直接parse時,精度丟失,結果如下:// { //  taskId: 1152921504735848700,//  status: 'CREATED',//  progress: 0,//  success: true // }const taskId = result.match(/[0-9]{19}/)[0] // 正則獲取19位數字的值result = result.replace(taskId,`"${taskId}"`) // 補上雙引號const data = JSON.parse(result) // { //  taskId: '1152921504735848759', // 解析出來之后是字符串,因此沒有丟失精度//  status: 'CREATED',//  progress: 0,//  success: true // }

結語

使用node也有一段時間了,因為涉及不到大數計算,因此對于編號啊,ID啊,都是用字符串形式進行存儲的,也就一直沒有遇到這個問題。這一次居然碰上了,不得不說js在這一方面確實有點弱勢,之后也嘗試了下使用Go,python進行請求,都是能正確解析不過node使用起來還是很舒服的

以上所述是小編給大家介紹的JS大坑之19位數的Number型精度丟失問題詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品欧美一区二区| 久久精品99久久久久久久久| 久久影视三级福利片| 国产精品自拍偷拍| 7777免费精品视频| 日本精品久久久久久久| 国内久久久精品| 日韩在线免费视频观看| 亚洲视频在线观看| www日韩中文字幕在线看| 日韩在线欧美在线国产在线| 青草青草久热精品视频在线观看| 亚洲男人天堂2024| 亚洲欧洲国产一区| 成人性教育视频在线观看| 色多多国产成人永久免费网站| 国产成人福利网站| 国产91精品网站| 欧美另类暴力丝袜| 欧美三级欧美成人高清www| 日韩免费高清在线观看| 992tv成人免费视频| 亚洲免费一在线| 亚洲成人黄色网址| 国产精品www| 亚洲国产精品成人精品| 91极品视频在线| 久精品免费视频| 国产一区二区日韩精品欧美精品| 成人欧美一区二区三区黑人孕妇| 97国产精品久久| 国产精品久久久久久久久久| 欧美丝袜第一区| 在线观看欧美日韩| 国产色综合天天综合网| 精品高清一区二区三区| 亚洲国产精品一区二区久| 日韩中文视频免费在线观看| 欧美大片va欧美在线播放| 国产主播在线一区| 久久五月天色综合| 中文字幕精品久久久久| 日本久久久久久| 亚洲男人天堂2019| 国语自产精品视频在免费| 亚洲人成毛片在线播放| 97色在线视频| 亚洲人成电影网站色…| 亚洲欧美日韩一区二区在线| 中文字幕日韩精品有码视频| 亚洲日本成人网| 国产精品96久久久久久又黄又硬| 久久精品国产亚洲一区二区| 日韩亚洲综合在线| 久久夜色撩人精品| 久久天天躁夜夜躁狠狠躁2022| 欧美亚洲视频在线看网址| www.日本久久久久com.| 久久久国产精品免费| 久久成年人视频| 亚洲香蕉成视频在线观看| 欧美性生交xxxxx久久久| 中文字幕久精品免费视频| 国产成人av在线播放| 美女扒开尿口让男人操亚洲视频网站| 久久久这里只有精品视频| 美女久久久久久久久久久| 91在线视频成人| 欧美xxxx做受欧美.88| 亚洲第一视频在线观看| 欧美在线激情网| 91亚洲精品在线观看| 国产午夜精品理论片a级探花| 欧美成人一区二区三区电影| 午夜精品99久久免费| 久久精品精品电影网| 国产精品www网站| 中文字幕日韩有码| 国产精品夜间视频香蕉| 欧美午夜电影在线| 91国内精品久久| 97热在线精品视频在线观看| 91产国在线观看动作片喷水| 日韩在线观看免费全集电视剧网站| 日韩精品在线影院| 欧洲成人免费视频| 中文字幕日韩专区| 成人性生交大片免费看小说| 91九色国产视频| 国产精品7m视频| 91日韩在线视频| 国产免费观看久久黄| 国产精品无码专区在线观看| 日韩电影免费观看在线| 日韩综合中文字幕| 亚洲国产精品久久精品怡红院| 久久成人一区二区| 国产精品亚洲欧美导航| 91超碰中文字幕久久精品| 亚洲精品视频在线播放| 国产婷婷成人久久av免费高清| 欧美日韩国产精品专区| 日韩在线视频导航| 亚洲人成网站在线播| 欧美精品videosex牲欧美| 欧美激情久久久久| 国产精品99久久99久久久二8| 亚洲视频777| 色婷婷综合久久久久中文字幕1| 久久精品国产欧美亚洲人人爽| 狠狠色狠狠色综合日日五| 欧美视频第一页| 久久99精品久久久久久琪琪| 国产日韩换脸av一区在线观看| 亚洲免费视频一区二区| 亚洲成av人片在线观看香蕉| 日韩精品视频在线播放| 久久中文久久字幕| 日本久久久久久| 欧美高清在线播放| 一本一本久久a久久精品综合小说| 亚洲精品国产综合区久久久久久久| 亚洲第一福利网| 欧美视频在线观看免费| 欧美精品激情在线| 超在线视频97| 日韩中文在线观看| 91极品女神在线| 日韩福利视频在线观看| 九九九热精品免费视频观看网站| 日韩在线观看你懂的| 国产精品久久久久久久久久| 色黄久久久久久| www欧美xxxx| 日韩欧美国产激情| 欧美黑人视频一区| 亚洲国产精品999| 久久成人在线视频| 欧美丝袜第一区| 最近中文字幕mv在线一区二区三区四区| 亚洲天堂男人天堂女人天堂| 久久夜精品香蕉| 国产一区二区色| 欧美成人网在线| 中文字幕av一区二区| 亚洲第一页中文字幕| 97免费中文视频在线观看| 久久人人爽人人爽人人片亚洲| 全亚洲最色的网站在线观看| www.亚洲一二| 国产精品情侣自拍| www.亚洲成人| 久久青草福利网站| 欧美自拍视频在线观看| 亚洲欧洲在线免费| 国产一区二区三区视频在线观看| 一区二区三区国产在线观看| 国产综合香蕉五月婷在线| 一区二区三区亚洲| 国产精品久久久久久久午夜| 日韩精品中文字幕久久臀| 欧美成aaa人片在线观看蜜臀| 国产精品久久久久久久久久新婚| 国产亚洲精品久久久久久777|