怎會出現10%+10%=0.11的明顯失誤 - 手機討論

Table of Contents

一般計算機要計算的時候會把人寫的算式轉成電腦看得懂的算式

電腦看得懂的就是後序式(又稱逆向波蘭式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問題,如果要解決就是在加減法裡的判斷式改一下就行了。

--

All Comments

Kama avatarKama2019-09-07
趕快推不然別人以為我看不懂
Mason avatarMason2019-09-10
幫我的笨腦袋QQ.....
Regina avatarRegina2019-09-13
我以為是乘除優先,所以才會算成10%的10%=0.11
Mason avatarMason2019-09-16
有沒有文組的說法
Oscar avatarOscar2019-09-18
其實二樓你說的也差不多對了90%了
Victoria avatarVictoria2019-09-21
在程式的邏輯裡 %的優先程度就跟乘除一樣
Kyle avatarKyle2019-09-24
簡單說就是x+y%會被計算機算成x+x*y*0.01。
Ula avatarUla2019-09-27
像美國特價都是寫多少off,例如40%off 像我腦中就會
Lauren avatarLauren2019-09-30
轉成價格*0.6,但是如果計算機按價格-40%,感覺也蠻符合美國人的邏輯。
George avatarGeorge2019-10-03
美國就懶的去算錢,我們台灣早習慣如何算%
Olga avatarOlga2019-10-06
美國只關心付的總數,台灣是考慮加%差多少
Odelette avatarOdelette2019-10-08
ex開發票5%, 我們習慣5%稅金算出來美國人應該只管你最後到底要付多少
Heather avatarHeather2019-10-11
推,第一次知道
Ursula avatarUrsula2019-10-14