2014-09-23 75 views
0

我正在爲我正在創建的一個小型Web應用程序創建我自己的自定義TimeObject類。JavaScript函數轉換毫秒產生奇怪的結果

在這裏,我定義一個函數來截取的有效範圍,毫秒整數,以實例化TimeObject如下:

TimeObject.prototype.millisecondsToTime = function(mm) { 
    function valid() { 
     if(parseInt(mm,10) >= 0 && parseInt(mm,10) <= 359999999) return true; 
    } 
    if(valid()) { 
     var h = Math.floor(mm/3600000); 
     var m = Math.floor(((mm/3600000)-h)*60); 
     var s = Math.floor(((((mm/3600000)-h)*60)-m)*60); 
     var mmFinal = Math.floor(((((((mm/3600000)-h)*60)-m)*60)-s)*1000); 
     this.hours = h, 
     this.minutes = m; 
     this.seconds = s; 
     this.milliseconds = mmFinal; 
    } else { 
     this.hours = 0, 
     this.minutes = 0; 
     this.seconds = 0; 
     this.milliseconds = 0; 
    } 
} 

似乎除了那些值很好地工作2^x的:

// 2^0 = 1 -> returns 0, should return 1 
// 2^1 = 2 -> returns 1, should return 2 
// 2^2 = 4 -> returns 3, should return 4 
// 2^3 = 8 -> returns 7, should return 8 
// And so on... 

值,如10011003,但不1002100402資源回報milliseconds pectively。他們應該返回13作爲milliseconds值,但不要。

我知道這是一個邏輯錯誤,但這裏發生了什麼,我該如何糾正我的代碼?

+0

嘗試使用整數代數而不是分割和乘數次。請記住,浮點運算會丟失小數精度 – 2014-09-23 16:34:20

回答

1

嘗試從您的計時器首先減去較小的元素,逐步刪除最小單位,然後除以該單位中的值數。

this.milliseconds = mm % 1000; 
mm = (mm - this.milliseconds)/1000; // mm is now measured in whole seconds 

this.seconds = mm % 60; 
mm = (mm - this.seconds)/60; // mm is now measured in whole minutes 

this.minutes = mm % 60; 
mm = (mm - this.minutes)/60; // mm is now measured in whole hours 

this.hours = mm; 

等。這將避免任何非整數數字出現在您的計算。

+0

不知道您是否誤解了我正在嘗試執行的操作,但是使用代碼適用於'0'和'999'之間的所有'mm'值,但只要我傳遞一個更大的值'999'我沒有得到預期的結果。看到這裏(在你的瀏覽器中打開你的控制檯):http://jsfiddle.net/g4fwf5gt/ – nhuff717 2014-09-26 16:50:28

+0

你會期望'1000'將'millisecond''設置爲'0','seconds'設爲'1',以及所有其他的值取決於許多毫秒適當地傳入。 – nhuff717 2014-09-26 16:51:34

+1

@ nhuff717是的,對不起,我完全忘了一些1000的因素。修改後的代碼應該比較容易理解,在http://jsfiddle.net/alnitak/上擺弄vo07vkaa/ – Alnitak 2014-09-26 19:48:26