2016年12月21日 星期三

Javascript : 小數位數失控

答應學生弄個二位小數的 PK 題庫,本以為很輕鬆的事,卻因為奇怪的小數位數問題而卡住。

本來想好的運算程序是:

  1. 設定要二位小數。
  2. 用亂數出一個三位數。
  3. 將三位數除以十的二次方。
程式碼大概這樣:

decimal_places = 2;
var factor = Math.pow(10, decimal_places); 
var tempRandom = tools.makeRandomIndex(1, factor-1);
var r = Math.floor(Math.random()*tempRandom.length);
var n1 = tempRandom[r]/factor;

註:上面的 tools.makeRandomIndex 是我用來產生兩個參數指定範圍內所有數,並打亂順序的自訂函數。

看起來沒問題,但當我用同樣的方法取出另一個數 n2,並將 n1 與 n2 相加的結果設給 answer 這個變數以後。有時卻會出現二位小數加上二位小數,產生比二位還多很多位的小數,而且答案雖然趨近於相加的結果,卻不是正確的。

一開始還懷疑是自己的演算程序有問題,除蟲除半天, toFixed() 和 toPrecision() 也搬出來用了,還是怪怪的。

廢話不多說,後來修改了一下程序:

decimal_places = 2;
var factor = Math.pow(10, decimal_places); 
var tempRandom = tools.makeRandomIndex(1, factor-1);
var r = Math.floor(Math.random()*tempRandom.length);
var n1 = tempRandom[r]; 
var tempRandom = tools.makeRandomIndex(1, factor-1);
var r = Math.floor(Math.random()*tempRandom.length);
var n2 = tempRandom[r]; 
var answer = (n1 + n2)/factor;

要給 answer 計算的 n1 和 n2 先不做除法(變成小數),等加完結果以後,再除10的二次方(本例中的 factor)。

程序調整以後,answer 的內容不會再出現小數多於二位的情形了。



沒有留言:

張貼留言

 
© 2009. Design by Pocket