2016-11-14 50 views
0

我想執行以下代碼無法理解JavaScript行爲

var n = 100; 
var sum =0; 
while(n>0) 
{ 
sum = sum + n%10; 
n = n/10; 
} 
console.log(sum); 

的結果應該是1,但JavaScript是返回

1.1111111111111112

此外,當我運行個別語句,它給出了非常好的結果, 可能的原因是什麼?

+2

第一次迭代n = 100,第二次n = 10,第三次n = 1,第四次n = 0.1,第五次n = 0.01,直到n小到等於0,在我機器上的1e-324處 – Kaiido

+1

*結果應該是1 *:爲什麼? –

+4

你爲什麼認爲它應該是1?當'n'進入十進制數字'0.1%10 == 0.1','0.01%10 == 0.01'時,你得到'n',所以你把它們加到前面的總和中,就得到了'1.1111 .....'你也很幸運,在一定的精確度下,這個值只是0,否則你會有一個無限循環 –

回答

2

沒有,結果不會是1.注意你的循環將n 10每次迭代,並且持續的條件是n > 0,直到它發生,這將需要許多次迭代:

  • ñ = 100,N%10 = 0
  • N = 10,N%10 = 0
  • n = 1時,N%10 = 1
  • N = 0.1,N%10 = 0.1
  • N = 0.01 ,n%10 = 0.01
  • ...

所以,結果是正確的:1.1111111 ......在2月末只不過是一個小數四捨五入誤差(最小的)更多。

7

它給的結果是正確的 -

允許進入while循環

對於第一迭代n = 100,因此n%10 = 0和總和= 0,第一環和後= 0和n = 10

在第二迭代n%10 = 0和總和= 0之後, 第二迭代總和= 0和n = 1

對於第三次迭代N%10 = 1和總和= 0, 之後第三迭代和= 1和n = 0.1

對於第四迭代n%10 = 0.1和總和= 1, 第四次迭代後總和= 1.1且n = 0.01

等等等等

最後的答案將是1.1111111111 ... ....趨於無窮大,因此成爲1.1111111111111112

希望這有助於

編輯

如果你想最終答案爲1,初始化n爲0.9(n = 0.9)

+0

最後!有人提出了OP的期望不正確的事實,而不是將一個數字四捨五入到完全無效的值。去的路! –

+0

雖然這anwer聲明發生了什麼,該操作沒有得到所要求的,一個結果。 –

+0

@NinaScholz編輯,得到最終答案爲1只是在這裏和那裏玩數字 – madhur