¿Cómo sumar números flotantes en el formato de horas y minutos?
Aquellos. si calcula dos de esos números, 0.35+3.45
entonces debería ser = 4.20
, no3.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 sum = 0.0;
arr.forEach(function(item) {
console.log(sum);
sum += parseFloat(item);
});
El resultado debería ser así:
0
0.15
0.35
4.20
5.0
7.0
7.30
12.50
13.50
15.30
16.40
19.20
20.20
javascript
usuario12916796
fuente
fuente
"."
para dividir esas cadenas, no":"
.0.5
las horas deben ser de 30 minutos, cualquier otra cosa es completamente irracional. Espero que no sea para un cliente en la vida real. O trabaje con valores flotantes de una unidad de tiempo fija o separe horas / minutos. Tan simple como eso.Respuestas:
La mejor manera de lidiar con formatos de datos "locos" como ese es primero convertirlos a un formato sensato y fácilmente procesable, hacer lo que sea necesario con los datos convertidos y finalmente (si es necesario) convertir los resultados nuevamente a El formato original.
(Por supuesto, la solución real es dejar de usar representaciones de tiempo tan locas por completo. Pero eso no siempre es práctico, por ejemplo, porque necesita interactuar con un sistema heredado que no puede cambiar).
En su caso, un formato adecuado adecuado para sus datos sería, por ejemplo, un número integral de minutos. Una vez que haya convertido sus datos a este formato, puede hacer aritmética ordinaria en él.
Tenga en cuenta que el código de conversión anterior multiplica primero el flotante de entrada por 100 y lo redondea a un entero antes de separar las partes de hora y minuto. Esto debería manejar de manera robusta las entradas con posibles errores de redondeo, evitando la necesidad de stringificar las entradas.
La razón para tener especial cuidado aquí es porque el número 0.01 = 1/100 (y la mayoría de sus múltiplos) en realidad no es exactamente representable en el formato binario de coma flotante utilizado por JavaScript. Por lo tanto, no puede tener un número JS que sea exactamente igual a 0.01; lo mejor que puede tener es un número tan cercano que convertirlo en una cadena ocultará automáticamente el error. Pero el error de redondeo sigue ahí y puede morderte si intentas hacer cosas como comparar esos números con un umbral exacto. Aquí hay una demostración agradable y simple:
fuente
Puede usar esta lógica después de hacer una simple suma aritmética, esto convertirá la suma en formato de tiempo
fuente
math.floor(sample/1)
lugar de solomath.floor(sample)
?sample / 1
, pensé que JS lo colocaría solo porque no había decimal en el divisor (como ensample / 1.0
, hace mucho tiempo desde que usé JS;), pero no fue así, rápidamente busqué en Google y agreguéfloor
, olvidé eliminar eso. De todos modos, gracias por señalar esoarr
no está en el resultado. Por ejemplo, siarr = [1.5, 2.5]
el resultado será en4
lugar de4.4
Aquí tienes, implementación en Javascript ES6. Hice un bucle de cada elemento y dividí las horas, minutos por minuto
.
, verifiqué si los minutos no existían; de lo contrario, asigne 0 cuenta el total de horas y minutos y apliqué el cálculo necesario.fuente
Debe convertir todo en horas o en minutos y luego hacer los cálculos.
fuente
Primero debes convertirlos a horas y minutos
fuente
¿Puedo saber por qué quieres que el primer resultado sea 0 ? A continuación se muestra una manera de hacer esto con un solo bucle. Los comentarios están en el código para explicar. Con cada ciclo agregamos los minutos, y si son mayores de 60, agregamos una hora y luego usamos % 60 para obtener los minutos restantes. Las carrozas pueden ser una molestia para trabajar,
Así que convertí los números a una cadena y luego a un int.
fuente
toString().split('.');
- Argh, en serio?fuente
0.15 + 0.2
¿ Por qué=0.17
? Debe ser0.35
La forma estándar de reducir un módulo es agregar el déficit después de la adición si se produjo un desbordamiento. Así es como haría la adición de BCD utilizando hardware binario, por ejemplo.
Aunque puede hacer la suma usando flotadores de esta manera, hay una cuestión de si debería hacerlo . Los problemas con el uso de números flotantes para operar en lo que son básicamente cantidades enteras son bien conocidos, y no los voy a repetir aquí.
Normalmente, la suma de fracciones flotantes funciona implícitamente con un módulo de 1.0, un desbordamiento de la fracción incrementa la parte entera. Si interpretamos el punto como el separador de horas.minutos, entonces queremos que la fracción se desborde en 0.6. Esto necesita que se agregue el déficit de 0.4 en el momento apropiado.
que produce el siguiente resultado, correcto dentro de un redondeo a lo que solicitó el OP
Dejé el formato final a dos decimales como ejercicio para el lector. Los 15 dígitos finales en todo su esplendor ilustran parte de por qué usar flotadores no es la mejor manera de hacerlo.
Además, considere lo que sucede cuando desea incluir segundos o días. Las dos formas bastante más estándar de segundos flotantes, o una tupla de enteros, de repente parecen mucho más sensatas.
fuente