Javascript 如何以小时和分钟的格式对浮点数求和?

Javascript 如何以小时和分钟的格式对浮点数求和?,javascript,Javascript,如何以小时和分钟的格式对浮点数求和 那些。如果计算两个这样的数字0.35+3.45,那么它应该是=4.20,而不是3.80 var-arr=[0.15,0.2,3.45,0.4,2,0.3,5.2,1,1.4,1.1,2.4,1,3.4] var总和=0.0; arr.forEach(功能(项目){ 控制台日志(总和); 总和+=浮动(项目); });您需要将所有内容转换为小时或分钟,然后进行计算 Example: 0.35 + 3.45 Convert 0.35 to Hours Numbe

如何以小时和分钟的格式对浮点数求和

那些。如果计算两个这样的数字
0.35+3.45
,那么它应该是=
4.20
,而不是
3.80

var-arr=[0.15,0.2,3.45,0.4,2,0.3,5.2,1,1.4,1.1,2.4,1,3.4]
var总和=0.0;
arr.forEach(功能(项目){
控制台日志(总和);
总和+=浮动(项目);

});您需要将所有内容转换为小时或分钟,然后进行计算

Example: 0.35 + 3.45
Convert 0.35 to Hours Number((35/60).toFixed(2))
= 0.58

Then convert 3hours 45 minutes into hours
= 3 + Number((45/60).toFixed(2))
= 3hours + 0.75 hours
= 3.75

Add the 2 conversions
= 0.58 + 3.75
= 4.33 hours

Convert the 0.33 back to minutes by multiplying by 60
= 4 hours 19.8 minutes ~ 20 mins

Hope that helps!
//经过简单的添加,我们得到了这个
//现在我们想把它改成4.2
样本=3.8
//下面是当前浮动显示的分钟数
分钟=(样本%1)*100
//时间呢
小时=数学楼层(示例)
//以下是可以从分钟减少的小时数
AddHours=数学楼层(分钟/60)
//将它们添加到小时计数中
小时数+=增加小时数
//还原薄荷糖
分钟%=60
//最后将小时和分钟格式化为您的格式
最终=小时+(分钟/100.0)

console.log(final)
您必须首先将它们转换为小时和分钟

var-arr=[0.15,0.2,3.45,0.4,2,0.3,5.2,1,1.4,1.1,2.4,1,3.4];
功能添加(arr){
var hm=arr
.map(v=>[Math.floor(v)、(v%1).toFixed(2)*100])//将数组映射到具有[hours,minutes]的值
.reduce((t,v)=>{//将[h,m]的数组减少为一个总时数和分钟数的对象
t={
h:t.h+v[0],
m:t.m+v[1]
};
返回t;
}, {
h:0,
m:0
});
//最终结果为=
//以上总小时数
//从总分钟算起的+小时(使用数学地板(hm.m/60))进行检索)
//+分钟(转换为小数部分后)
返回(parseFloat(hm.h+数学下限(hm.m/60))+parseFloat(hm.m%60)/100.toFixed(2)).toFixed(2);
}
//添加'arr'数组
控制台日志(添加(arr));
//加上0.35+3.45

日志(添加([0.35,3.45])这里是Javascript ES6中的实现。 我循环每个元素,并按
划分小时、分钟, 检查分钟数是否不存在,否则分配0 计算小时和分钟的总数,并进行必要的计算

constresultobj=[0.35,3.45]。减少((a,e)=>{
常数[小时,分钟]=e.toString().split('.');
a、 h+=+小时;
a、 m+=(+(分钟.padEnd(2,0))| | 0);
返回a;
},{h:0,m:0});
const result=resultObj.h+数学楼层(resultObj.m/60)+(resultObj.m%60)/100);

控制台日志(结果)我可以知道为什么第一个结果是0?下面是一种使用单个循环实现此目的的方法。注释是在代码中解释的。 对于每个循环,我们添加分钟数,如果它们大于60,则添加一小时,然后使用%60获得剩余的分钟数。漂浮物可能是一种痛苦

e、 G1.1+2.2==3.3为假

所以我把数字转换成字符串,然后再转换成整数

var-arr=[0.15,0.2,3.45,0.4,2,0.3,5.2,1,1.4,1.1,2.4,1,3.4];
设hoursTally=0;
设最小值=0;
对于(变量i=0;i=60){
hoursTally++;
//将最小值设置为除以60后的余数
最小值=最小值%60;
}
}
控制台日志(小时计数+“+”分钟计数);
}
const arr=[0.15,0.2,3.45,0.4,2,0.3,5.2,1,1.4,1.1,2.4,1,3.4]
常数减速机=(附件,当前)=>{
acc=`${acc}`。拆分('.')。长度>1?acc:`${acc}.0`;
curr=`${curr}`.split('..)。长度>1?curr:`${curr}.0`;
设hours=parseStrAndSum(true,`${acc}`.split('..)[0],`${curr}`.split('.')[0]);
让minute=parseStrAndSum(false,`${acc}`.split('.')[1],`${curr}`.split('.')[1]);
小时=parseInt(小时/1)+parseInt(分钟/60);
分钟=分钟%60;
log(`${acc}+${curr}=${hours}.${minute}`);
返回`${hours}.${minute}`;
}
const parseStrAndSum=(is_hours,…strs)=>{
设结果=0;
标准forEach(功能(编号){
如果(!是_小时){
number=number.length==1?`${number}0`:number;
}
结果+=parseInt(数字);
});
返回结果;
};
arr.reduce(减速器)处理这种“疯狂”数据格式的最佳方法是,首先将它们转换为一种合理且易于处理的格式,然后使用转换后的数据执行任何需要执行的操作,最后(如果必须)将结果转换回原始格式

(当然,真正的解决方案是完全停止使用这种疯狂的时间表示法。但这并不总是可行的,例如,因为您需要与无法更改的遗留系统进行接口。)

在您的情况下,适合您的数据的sane格式应为整数分钟。一旦您将数据转换成这种格式,就可以对其进行普通的算术运算

//将形式为hh.mm的伪浮点转换为整数分钟数
//对浮点舍入错误具有鲁棒性,也适用于负数
函数hhMmToMinutes(x){
const hhmm=Math.round(100*x)//转换hh.mm->hhmm
返回60*Math.trunc(hhmm/100)+(hhmm%100)
}
//将分钟转换回hh.mm伪浮点格式
//如果需要尾随零,请使用minutesToHhMm(minutes).toFixed(2)
功能分钟数OHHMM(分钟){
返回Math.trunc(分钟/60)+(分钟%60)/100
}
常数arr=[0.15,0.2,3.45,0.4,2,0.3,5.2,1,1
function add_float_hours_minutes(a, b)
{
  var trial_sum = a+b;
  // did an actual overflow occur, has the integer part incremented?
  if ( Math.floor(trial_sum) > Math.floor(a)+Math.floor(b) )  {
    trial_sum += 0.4;
  }
  // has the fractional part exceeded its allotted 60 minutes?
  if ( trial_sum-Math.floor(trial_sum) >= 0.6)  {
    trial_sum += 0.4;
  }
  return trial_sum;
}

var arr = [0.15, 0.2, 3.45, 0.4, 2, 0.3, 5.2, 1, 1.4, 1.1, 2.4, 1, 3.4]

var sum = 0.0;

arr.forEach(function(item) {
  console.log(sum);
  // sum += parseFloat(item);
  sum = add_float_hours_minutes(sum, parseFloat(item));
});
0
0.15
0.35
4.2
5.000000000000001
7.000000000000001
7.300000000000001
12.5
13.5
15.3
16.400000000000002
19.2
20.2