2016-12-06 41 views
-1

我有一個if語句的for循環。由於某些原因,代碼並未評估何時i = .01它似乎仍然評估以前的if語句。該代碼會產生這樣的:索引在for循環中出錯,並且在R中有if子句

boom for change 0.01 needs 0 quarters, 0 dimes, 0 nickels and 1 pennies 
boom for change 0.02 needs 0 quarters, 0 dimes, 0 nickels and 2 pennies 
boom for change 0.03 needs 0 quarters, 0 dimes, 0 nickels and 3 pennies 
boom for change 0.04 needs 0 quarters, 0 dimes, 0 nickels and 4 pennies 
zoom for change 0.05 needs 0 quarters, 0 dimes, 1 nickels and 0 pennies 
zoom for change 0.06 needs 0 quarters, 0 dimes, 1 nickels and 1 pennies 
zoom for change 0.07 needs 0 quarters, 0 dimes, 1 nickels and 2 pennies 
zoom for change 0.08 needs 0 quarters, 0 dimes, 1 nickels and 3 pennies 
zoom for change 0.09 needs 0 quarters, 0 dimes, 1 nickels and 4 pennies 
zoom for change 0.1 needs 0 quarters, 0 dimes, 1 nickels and 5 pennies 

不過,我想最後一行讀

haha for change 0.1 needs 0 quarters, 1 dimes, 0 nickels and 0 pennies 

這裏是我的代碼,你可以運行它,並得到所有我有同樣的結果。

testchange <- seq(.01,.1, by =.01) 

q <- .25 
d <- .1 
n <- .05 
p <- .01 
qNumber <- 0 
dNumber <- 0 
nNumber <- 0 
pNumber <- 0 


for(i in testchange) 
{ 


if(i < .05) 
{pNumber <- (i*100) 
testy <- "boom"} 

else if(i >= .05 & i < .1) 
{ 
testy <- "zoom" 
if(i%%n == 0) 
{nNumber <- (i/n) 
newNum3 <- 0} 
else if(i%%n != 0) 
{newNum3 <- (100*(i%%n))} 

if(newNum3 < 5) 
{ 
    pNumber <- newNum3 
} 

} 

if(i >= .1 & i < .25) 
{ 
testy <- "haha" 
if(i%%d == 0) 
{dNumber <- (i/d) 
newNum2 <- 0 
newNum3 <- 0} 
else if(i%%d != 0) 
{newNum2 <- (100*(i%%d))} 

if(newNum2 >=5) 
{ 
    if(newNum2%%n == 0) 
    {nNumber <- (i/n) 
    newNum3 <- 0} 
    else if(newNum2%%n != 0) 
    { newNum3 <- (100*(i%%n))} 

} 
if(newNum2 < 5) 
{ 
    pNumber <- newNum2 
} 
if(newNum3 < 5) 
{ 
    pNumber <- newNum3 
} 

} 
cat(testy, "for change " , i , " needs " , qNumber 
    , " quarters, " , dNumber , " dimes, " , nNumber 
    , " nickels and " , pNumber , " pennies","\n") 
} 
+0

農產品http://stackoverflow.com/help/mcve,並且不與縮進東西,使你的代碼更易讀。 – user31264

+0

只需在您的編輯器中運行它並自動添加即可。 –

+0

我不打算這樣做。你希望我們花費我們的時間並免費爲你提供幫助,所以你應該盡力讓它變得容易。 – user31264

回答

1

這是舍入誤差。循環的最後一步產生了一個非常接近但小於0.1的數字。如果你改變你的線

if(i >= .1 & i < .25) 

if(i + 0.00001 >= .1 & i < .25) 

你會得到您所期望的答案。請注意,您應該在別處做出許多類似的更改。

+0

我明白了,這確實回答了爲什麼聲明沒有評估,但現在它顯示2個鎳幣不是1毛錢......回到繪圖板。謝謝! –

+0

你能告訴我,'我'可以改變它的值而不是'1'嗎? –

+0

計算機算術是以2爲基數的。在有限數量的二進制數字中,不能準確地表示0.1。看看[關於舍入錯誤的維基百科文章](https://en.wikipedia.org/wiki/Round-off_error) – G5W