2014-09-23 73 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