2016-12-06 3 views
-1

У меня есть цикл for с операторами if. По какой-то причине код не оценивает, когда i = .01, по-видимому, по-прежнему оценивает предыдущий оператор if. Код производит это:индекс идет не так, как в цикле for и если в R

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

вы могли бы рассказать мне, как возможно, что 'i' может изменить свое значение, а не быть .1 точно? –

+0

Компьютерная арифметика - это база 2. Вы не можете точно представить 0,1 в конечном числе двоичных цифр. Взгляните на статью [Wikipedia Article on Round-off error] (https://en.wikipedia.org/wiki/Round-off_error) – G5W