Re: [問題] 怎會出現10%+10%=0.11的明顯失誤

看板MobileComm作者時間4年前 (2019/09/04 13:00), 編輯推噓7(709)
留言16則, 8人參與, 4年前最新討論串5/5 (看更多)
一般計算機要計算的時候會把人寫的算式轉成電腦看得懂的算式 電腦看得懂的就是後序式(又稱逆向波蘭式Reverse polish notation) 以10%+10%來說會被轉換成10%10%+,這時候看網路找到的計算機原始碼 double s[] = context.stackRe; int percentPC = -2; for (int pc = 0; pc < codeLen; ++pc) { final int opcode = code[pc]; switch (opcode) { case VM.CONST: s[++p] = constsRe[constp++]; break; case VM.ADD: { final double a = s[--p]; double res = a + (percentPC == pc-1 ? s[p] * s[p+1] : s[p+1]); s[p]= res break; case VM.SUB: { final double a = s[--p]; double res = a - (percentPC == pc-1 ? s[p] * s[p+1] : s[p+1]); s[p] = res; break; } case VM.PERCENT: s[p] = s[p] * .01; percentPC = pc; break; } return p; 一開始會先將10%10%+放進一個陣列裡[10,%,10,%,+] 另外再準備一個空的堆疊器s 接著進行掃描 step 1 掃到10因為是常數所以直接放進s這個堆疊裡面 step 2 掃到%,根據case VM.PERCENT 會將s裡的10取出來進行百分比運算然後precentPC 這個pointer會指向%這個位置 step 3 掃到10再放進s裡 step 4 掃到% 跟步驟2一樣 step 5 掃到+ 根據 case VM.ADD: double res = a + (percentPC == pc-1 ? s[p] * s[p+1] : s[p+1]); 其中加法運算元中有這個判斷式(減法裡也是有一樣的判斷式) 因為percentPC == pc-1 這個條件成立所以變成0.1*0.1 所以最後算式變成0.1+0.1*0.1 = 0.11 所以也不是什麼BUG問題,如果要解決就是在加減法裡的判斷式改一下就行了。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.136.181.4 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/MobileComm/M.1567573246.A.230.html

09/04 13:05, 4年前 , 1F
趕快推不然別人以為我看不懂
09/04 13:05, 1F

09/04 13:06, 4年前 , 2F
幫我的笨腦袋QQ.....
09/04 13:06, 2F

09/04 13:07, 4年前 , 3F
我以為是乘除優先,所以才會算成10%的10%=0.11
09/04 13:07, 3F

09/04 13:21, 4年前 , 4F
有沒有文組的說法
09/04 13:21, 4F

09/04 13:23, 4年前 , 5F
其實二樓你說的也差不多對了90%了
09/04 13:23, 5F

09/04 13:25, 4年前 , 6F
在程式的邏輯裡 %的優先程度就跟乘除一樣
09/04 13:25, 6F

09/04 13:30, 4年前 , 7F
簡單說就是x+y%會被計算機算成x+x*y*0.01。
09/04 13:30, 7F

09/04 13:44, 4年前 , 8F
像美國特價都是寫多少off,例如40%off 像我腦中就會
09/04 13:44, 8F

09/04 13:45, 4年前 , 9F
轉成價格*0.6,但是如果計算機按價格-40%,感覺也蠻
09/04 13:45, 9F

09/04 13:45, 4年前 , 10F
符合美國人的邏輯。
09/04 13:45, 10F

09/04 15:14, 4年前 , 11F
美國就懶的去算錢,我們台灣早習慣如何算%
09/04 15:14, 11F

09/04 15:15, 4年前 , 12F
美國只關心付的總數,台灣是考慮加%差多少
09/04 15:15, 12F

09/04 15:17, 4年前 , 13F
ex開發票5%, 我們習慣5%稅金算出來
09/04 15:17, 13F

09/04 15:17, 4年前 , 14F
美國人應該只管你最後到底要付多少
09/04 15:17, 14F

09/05 12:58, 4年前 , 15F
推,第一次知道
09/05 12:58, 15F

09/06 00:53, 4年前 , 16F
09/06 00:53, 16F
文章代碼(AID): #1TRqJ-8m (MobileComm)
討論串 (同標題文章)
文章代碼(AID): #1TRqJ-8m (MobileComm)