欧美日韩亚洲精品一区二区三区_亚洲一二三区在线观看_欧亚一区二区_一区二区三区美女

當前位置:第一POS網 > 刷卡機知識點2 >

刷卡時刷卡機錯誤碼9999

瀏覽:91 發布日期:2023-07-10 00:00:00 投稿人:佚名投稿

網上關于刷卡時刷卡機錯誤碼9999的刷卡知識比較多,也有關于刷卡時刷卡機錯誤碼9999的問題,今天第一pos網(m.javbus2020.com)為大家整理刷卡常見知識,未來的我們終成一代卡神。

本文目錄一覽:

1、刷卡時刷卡機錯誤碼9999

刷卡時刷卡機錯誤碼9999

復制粘貼一時爽,頻出 bug 火葬場。對開發者而言,Stack Overflow 和 GitHub 是最為熟悉不過的兩大平臺,這些平臺充斥著大量開源項目信息和解決各類問題的代碼片段。最近,一位叫做 Aioobe 的開發者在一項調查中發現了一段自己十年前寫的代碼,這段代碼成為了 Stack Overflow 上復制次數最多、傳播范圍最廣的答案,GitHub 的眾多項目中也存在這段代碼。然而,這位開發者表示這段代碼其實是有 bug 的,并于近日更新了答案并作出說明。

這段代碼是干啥的?

2010 年的時候,我整天泡在 Stack Overflow 上回答問題,希望可以提高自己的知名度。當時,有一個問題吸引了我的注意:如何以人類可讀的格式輸出字節數?舉個例子,將“123456789 字節”轉換為“123.5 MB”的格式輸出。

這是現在的截圖,但問題確實是這個

這里的隱含范式在于所得到的字符串值應該在 1 到 999.9 之間,后面再跟上一個大小合適的單位。當時已經有人給了一條回應。答案中的代碼以循環為基礎,基本思路非常簡單:嘗試所有單位,從最大(EB,即 1018 字節)到最小(B,即 1 字節),而后使用一種顯示數量小于實際字節數量的單位。用偽代碼寫出來,基本是這么個意思:

\ue676復制代碼

suffixes = [ "EB", "PB", "TB", "GB", "MB", "kB", "B" ]magnitudes = [ 1018, 1015, 1012, 109, 106, 103, 100 ]i = 0while (i < magnitudes.length && magnitudes[i] > byteCount) i++printf("%.1f %s", byteCount / magnitudes[i], suffixes[i])

一般來說,如果發布的正確答案已經獲得了正分數,那后發者很難追上。在 Stack Overflow 上,這就叫“拔槍最快的贏”。不過,我認為這個答案有缺陷,所以準備重新改改。我意識到,無論是 KB、MB 還是 GB,所有單位的本質實際都是 1000 的冪(當然,按 IEC 標準來講是 1024),意味著應該可以使用對數而非循環來計算正確的量級單位。

基于以上思路,我發布了下列內容:

\ue676復制代碼

public static String humanReadableByteCount(Long bytes, boolean SI) { int unit = si ? 1000 : 1024; if (bytes < unit) return bytes + " B"; int exp = (int) (Math.log(bytes) / Math.log(unit)); String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp-1) + (si ? "" : "i"); return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);}

當然,這段代碼可讀性不高,而且 log/pow 也可能在一定程度上影響執行效率,但至少這里沒有循環,幾乎不涉及分支,我覺得還是比較整潔的。

這里面使用的數學方法非常簡單。字節計數表示為 byeCount=1000s , 其中的 s 代表小數點后的位數(以二進制表示,則使用 1024 為基數),求解 s,即可得出 s=log1000(byteCount)。

API 里沒有現成的 log1000 可以直接使用,但我們不妨用自然對數來表示,即 s\u205f=\u205flog(byteCount)\u205f/\u205flog(1000)。接下來,我們取 s 的底(即取整數),因為假如我們得出的結果超過 1 MB(但不足 1 GB),則希望繼續使用 MB 作為表示單位。

此時,如果 s=1,則單位為 KB;如果 s=2,則單位為 MB;依此類推,我們將 byteCount 值除以 1000s ,然后取對應的單位。

接下來,我能做的就是等待,看看社區是否喜歡這個答案。那時候的我,絕對想不到它會成為 Stack Overflow 上復制最多的代碼片段。

BUG 在哪?

估計不少人看到這兒肯定在想,這段代碼里到底有什么 bug?

再來看一遍代碼:

\ue676復制代碼

public static String humanReadableByteCount(long bytes, boolean si) { int unit = si ? 1000 : 1024; if (bytes < unit) return bytes + " B"; int exp = (int) (Math.log(bytes) / Math.log(unit)); String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp-1) + (si ? "" : "i"); return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);}

在 EB,即 1018 之后,接下來的單位應該是 ZB,即 1021。難道是輸入量過大導致“kMGTPE”字符串的索引超出范圍?不是的,long 的最大值是 263\u205f-\u205f1\u205f≈\u205f9.2\u205f×\u205f1018,因此任何 long 值都不會超出 EB 范圍。

那么,是 SI 與二進制之間存在混雜嗎?也不是。答案的早期版本中確實有這個問題,但很快就得到了修復。

那么,是不是 exp 可以為 0 會導致 charAt(exp-1) 發生錯誤?不是的。第一個 if 語句也涵蓋了這種情況,因此 exp 值將始終至少為 1。

那就只剩最后一種情況了,輸出結果中是否存在某些奇怪的舍入錯誤?這正是我們接下來要討論的部分……

太多個 9

這套解決方案一直運作良好,直到字節數量達到 1 MB。假定輸入為 999999 字節,那么結果(在 SI 模式下)將為“1000.0 kB”。盡管 999999 比 999.9 x 10001 更接近于 1000 x 10001,但根據規范,1000 的“有效位數”超出了范圍。正確的結果應該是“1.0 MB”。

無論如何,在這個帖子的所有 22 個答案中(包括使用 Apache Commons 以及 Android 庫的答案)截至本文撰稿之時都存在這個錯誤(或者其變體)。那么,我們該如何解決?

首先,我們會注意到,一旦字節數比 999.9 x 10001(999.9 k)更接近于 1 x 10002(1 MB),則指數(exp)就應由“k”變更為“M”。例如,9999950 就符合這種情況。同樣的,當我們輸入 999950000 時,我們應該從“M”切換為“G”,依此類推。為了達成這一目標,我們會計算該閾值,一旦字節數超過閾值,則增加 exp:

\ue676復制代碼

if (bytes >= Math.pow(unit, exp) * (unit - 0.05)) exp++;

調整之后,代碼即可正常工作,直到字節數接近 1 EB。以輸入為 999,949,999,999,999,999 為例,其目前的結果為 1000.0 PB,但正確結果應該是 999.9 PB。但從數學上講,代碼結果又是準確的,這又是怎么回事?這里,我們就遇到了 double(雙)精度機制的局限性。

浮點運算基礎知識

由于采用 IEEE 754 表示方式,因此近零浮點值會非常密集,但大值則非常稀疏。實際上,所有浮點值中的一半都位于 -1 與 1 之間;而在談到大雙精度浮點數時,像 Long.MAX_VALUE 那么大的值已經沒有任何意義了。

\ue676復制代碼

double l1 = Double.MAX_VALUE;double l2 = l1 - Long.MAX_VALUE;System.err.println(l1 == l2); // prints true

下面來看兩項有問題的計算:

String.format 參數中的除法;exp 進位閾值

我們當然可以切換為 BigDecimal,但這么干就沒意思了。另外,由于標準 API 中沒有 BigDecimal log 函數,所以問題其實仍然存在。

縮小中間值

對于第一個問題,我們可以將字節值縮小至更合理的精度范圍,同時相應調整 exp。無論如何,最終結果都會四舍五入,因此我們要做的就是不要舍棄最低有效數字。

\ue676復制代碼

if (exp > 4) { bytes /= unit; exp--;}

調整最低有效位

對于第二個問題,我們當然關心最低有效位(999、949、99…9 與 999,950,00…0 應該以不同的單位結尾),因此必須得想個不同的解決方案。

首先,我們注意到閾值存在 12 種不同的可能值(每種模式 6 種),而且其中只有一種最終會發生故障。通過以 D0016 結尾這一跡象,可以準確識別出錯誤結果。一旦發生這種情況,我們將其調整為正確值即可。

\ue676復制代碼

long th = (long) (Math.pow(unit, exp) * (unit - 0.05));if (exp < 6 && bytes >= th - ((th & 0xFFF) == 0xD00 ? 52 : 0)) exp++;

由于我們在浮點結果中需要使用特定數位模式,因此下手的對象自然就是 strictfp,旨在保證其不受硬件運行代碼的影響。

負輸入

目前我還沒想到什么情況下有可能需要使用負字節數量,但考慮到 Java 不支持無符號 long,我們最好還是把這個問題考慮進來。現在,如果輸入為 -10000,那么結果為 -10000 B。這里我們引入 absBytes:

\ue676復制代碼

long absBytes = bytes == Long.MIN_VALUE ? Long.MAX_VALUE : Math.abs(bytes);

這里的表達之所以如此復雜,是基于 -Long.MIN_VALUE == Long.MIN_VALUE 這一事實。現在,我們利用 absBytes 替代 bytes 執行所有與 exp 相關的計算。

最終版本

以下是代碼片段的最終版本,其中已經對最初版本做了精心調整與改進:

\ue676復制代碼

// 來自: https://programming.guide/the-worlds-most-copied-so-snippet.htmlpublic static strictfp String humanReadableByteCount(long bytes, boolean si) { int unit = si ? 1000 : 1024; long absBytes = bytes == Long.MIN_VALUE ? Long.MAX_VALUE : Math.abs(bytes); if (absBytes < unit) return bytes + " B"; int exp = (int) (Math.log(absBytes) / Math.log(unit)); long th = (long) (Math.pow(unit, exp) * (unit - 0.05)); if (exp < 6 && absBytes >= th - ((th & 0xfff) == 0xd00 ? 52 : 0)) exp++; String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i"); if (exp > 4) { bytes /= unit; exp -= 1; } return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);}

請注意,這段代碼最初的目標是避免由循環以及大量分支帶來的復雜性。在解決了所有極端情況之后,新代碼的可讀性要比原始版本更差。我個人是肯定不會把這段代碼復制到生產代碼中的。

這段代碼被復制到了哪里?

2018 年,一位名叫 Sebastian Baltes 的博士生在《Empirical Software Engineering》上發表了一篇論文,標題為《GitHub 項目中 Stack Overflow 代碼片段的用法與歸因》,文章探討的核心議題只有一個:用戶對代碼片段的引用是否遵循 Stack Overflow 的 CC BY-SA 3.0 許可,即從 Stack Overflow 上復制代碼時,用戶應保證何等程度的歸因水平?

在分析當中,作者從 Stack Overflow 數據轉儲中提取出代碼片段,并將其與公共 GitHub 存儲庫中的代碼進行匹配。下面來看論文的基本發現:

我們進行了一項大規模實證研究,分析了來自各公共 GitHub 項目中的非常規 Java 代碼片段,對其中實際上源自 Stack Overflow 的代碼片段進行了用法與歸因調查。

這篇文章給出了一份表格,而其中 ID 為 3758880 的答案正是我八年前發布的那一條。截至目前,這條答案獲得了幾十萬次查看外加一千多個好評。只要在 GitHub 上隨便搜搜,就能找到成千上萬條 humanReadableByteCount。

這也就意味著,這段有問題的代碼被無數的項目和開發者引用,要驗證這段代碼是否也在自己的本地存儲庫內,請執行以下操作:

\ue676復制代碼

$ git grep humanReadableByteCount

心得摘要

最后,我希望告訴廣大開發者 Stack Overflow 上的代碼片段可能存在 bug,即使得到無數好評也改變不了這一事實;一定要對所有極端情況做出測試,特別是測試那些復制自 Stack Overflow 的代碼;浮點運算很復雜,也很困難,在復制代碼時,請確保了解代碼背后的邏輯和使用規范。

以上就是關于刷卡時刷卡機錯誤碼9999的知識,后面我們會繼續為大家整理關于刷卡時刷卡機錯誤碼9999的知識,希望能夠幫助到大家!

轉載請帶上網址:http://m.javbus2020.com/shuakatwo/232979.html

版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 babsan@163.com 舉報,一經查實,本站將立刻刪除。
聯系我們
訂購聯系:小莉
微信聯系方式
地址:深圳市寶安區固戍聯誠發產業園木星大廈

公司地址:深圳市寶安區固戍聯誠發產業園木星大廈

舉報投訴 免責申明 版權申明 廣告服務 投稿須知 技術支持:第一POS網 Copyright@2008-2030 深圳市慧聯實業有限公司 備案號:粵ICP備18141915號

欧美日韩亚洲精品一区二区三区_亚洲一二三区在线观看_欧亚一区二区_一区二区三区美女
在线一区视频| 亚洲国产日韩欧美综合久久| 欧美黑人一区二区三区| 免费观看成人鲁鲁鲁鲁鲁视频| 男男成人高潮片免费网站| 欧美精品色网| 国产女主播视频一区二区| 狠狠色丁香婷婷综合久久片| 亚洲国产欧美日韩另类综合| 一本久道久久久| 午夜精品视频在线观看一区二区| 欧美在线观看视频| 欧美电影在线观看完整版| 国产精品v欧美精品∨日韩| 国产毛片精品国产一区二区三区| 很黄很黄激情成人| 亚洲精品视频在线观看免费| 午夜精品一区二区三区四区 | 99这里有精品| 欧美中文日韩| 欧美国产一区视频在线观看| 国产精品一香蕉国产线看观看| 在线观看视频一区二区| 一区二区三区毛片| 久久九九电影| 欧美午夜激情在线| 伊人久久大香线蕉av超碰演员| 一区二区三区日韩精品视频| 久久久久国色av免费观看性色| 欧美日韩免费看| 一区二区亚洲精品国产| 这里只有精品丝袜| 麻豆久久精品| 国产乱码精品一区二区三区五月婷| 亚洲第一成人在线| 午夜精彩视频在线观看不卡| 欧美高清一区| 国产亚洲综合在线| 亚洲午夜精品久久久久久app| 狂野欧美一区| 国产欧美二区| 中文国产一区| 麻豆成人91精品二区三区| 国产农村妇女精品一二区| 日韩亚洲国产欧美| 老鸭窝91久久精品色噜噜导演| 国产精品无码专区在线观看| 亚洲精品一区二区三| 久久精品一区二区三区四区| 国产精品久久网| 欧美中文字幕视频| 欧美日韩一本到| 91久久精品一区二区三区| 久久电影一区| 国产精品亚洲综合一区在线观看| 99re成人精品视频| 免费亚洲婷婷| 狠狠色狠色综合曰曰| 午夜精品免费视频| 欧美视频精品一区| 亚洲九九精品| 欧美国产激情| 亚洲国产精品成人精品| 久久人人看视频| 国模私拍视频一区| 欧美一区二区在线免费观看| 国产精品美女久久久久久久 | 亚洲精品免费一二三区| 久久在线精品| 国内精品国产成人| 欧美影院视频| 国产欧美日韩专区发布| 亚洲一区在线直播| 欧美日韩在线视频观看| 日韩午夜在线视频| 欧美激情一区二区三区全黄| 亚洲国产导航| 欧美成人午夜激情| 在线日韩av| 毛片av中文字幕一区二区| 激情综合亚洲| 久久中文字幕一区| 国语对白精品一区二区| 久久精品一区二区三区中文字幕| 国产美女高潮久久白浆| 香蕉成人久久| 国产香蕉久久精品综合网| 欧美一激情一区二区三区| 国产精品免费区二区三区观看| 在线一区二区三区四区五区| 欧美日韩亚洲高清| 亚洲私人影院| 国产精品视频| 欧美在线视频在线播放完整版免费观看| 欧美日韩第一页| 夜夜爽www精品| 欧美偷拍另类| 午夜精品福利视频| 国产亚洲在线| 久热成人在线视频| 亚洲精品乱码久久久久久黑人| 欧美精品日韩精品| 亚洲欧美激情视频在线观看一区二区三区 | 亚洲精品亚洲人成人网| 欧美日韩人人澡狠狠躁视频| 中文国产亚洲喷潮| 国产美女一区| 久久久久久久综合日本| 亚洲国产精品专区久久| 欧美日韩国产经典色站一区二区三区| 制服丝袜激情欧洲亚洲| 国产毛片精品视频| 麻豆精品在线视频| 一本到高清视频免费精品| 国产精品免费福利| 久久综合精品国产一区二区三区| 亚洲国产一区二区视频| 欧美视频一区二区在线观看| 午夜宅男欧美| 在线观看一区| 欧美精品在线一区二区| 亚洲一区二区三区在线视频| 国产精品视频久久| 欧美一级日韩一级| 国产精品久久久久久久久搜平片| 欧美一区二区三区四区视频| 国模叶桐国产精品一区| 噜噜噜噜噜久久久久久91| 99国产精品久久| 国产精品麻豆va在线播放| 性色av香蕉一区二区| 经典三级久久| 一区二区三区日韩精品| 国产最新精品精品你懂的| 欧美成人国产| 亚洲一级免费视频| 国产日韩高清一区二区三区在线| 久久午夜精品| 亚洲自拍偷拍一区| 国产一区二区三区免费观看 | 欧美日韩不卡| 香蕉乱码成人久久天堂爱免费| 伊人成人在线视频| 欧美性片在线观看| 欧美专区18| 91久久国产精品91久久性色| 欧美日一区二区在线观看| 欧美一区1区三区3区公司| 亚洲精品日产精品乱码不卡| 亚洲天堂激情| 国内精品久久久久影院优| 欧美激情第1页| 午夜精品在线| 一本一本久久a久久精品牛牛影视| 国产精品一区二区a| 狼人社综合社区| 中文精品一区二区三区| 欧美午夜宅男影院| 免费av成人在线| 亚洲一级高清| 亚洲国产三级| 国产精品免费看| 老司机成人网| 久久xxxx精品视频| 99国产精品私拍| 国产一区二三区| 欧美三级午夜理伦三级中文幕 | 六月婷婷一区| 亚洲小说春色综合另类电影| 国产综合亚洲精品一区二| 欧美日韩国产综合久久| 久久久午夜精品| 亚洲五月六月| 亚洲国产精选| 在线观看视频一区二区欧美日韩| 国产精品久久久久久久电影 | 国产精品theporn| 老司机精品导航| 亚洲欧美日韩在线不卡| 国产精品99久久久久久www| 激情成人av| 国产精品在线看| 欧美日韩亚洲高清| 免费亚洲电影在线| 欧美中文字幕视频| 亚洲一区二区精品在线| 一区二区三区日韩精品| 最新成人在线| 国产主播精品在线| 国产精品久久久久av| 欧美成人嫩草网站| 男女视频一区二区| 久久精品视频在线看| 亚洲影音先锋| 一区二区免费看| 妖精视频成人观看www| 在线观看视频一区二区| 国产乱理伦片在线观看夜一区| 欧美三区不卡| 麻豆国产精品777777在线| 久久亚洲精品网站| 久久精品系列| 欧美一区二区三区男人的天堂| 亚洲天堂av在线免费|