¿Cómo puedo redondear un número decimal (punto flotante) al entero más cercano?
p.ej
1.2 = 1
1.7 = 2
fuente
¿Cómo puedo redondear un número decimal (punto flotante) al entero más cercano?
p.ej
1.2 = 1
1.7 = 2
Salida de perldoc -q round
¿Perl tiene una función round ()? ¿Qué pasa con ceil () y floor ()? ¿Funciones de disparo?Recuerde que
int()
simplemente se trunca hacia0
. Para redondear a un cierto número de dígitos,sprintf()
oprintf()
suele ser la ruta más fácil.
printf("%.3f", 3.1415926535); # prints 3.142
El
POSIX
módulo (parte de la distribución estándar de Perl) implementosceil()
,floor()
y una serie de otras funciones matemáticas y trigonométricas.
use POSIX; $ceil = ceil(3.5); # 4 $floor = floor(3.5); # 3
En 5.000 a 5.003 perls, la trigonometría se realizó en el
Math::Complex
módulo. Con 5.004, elMath::Trig
módulo (parte de la distribución estándar de Perl) implementa las funciones trigonométricas. Internamente usa elMath::Complex
módulo y algunas funciones pueden salir del eje real al plano complejo, por ejemplo, el seno inverso de 2.El redondeo en las aplicaciones financieras puede tener serias implicaciones, y el método de redondeo utilizado debe especificarse con precisión. En estos casos, probablemente valga la pena no confiar en el sistema de redondeo que utiliza Perl, sino implementar la función de redondeo que usted necesita.
Para ver por qué, observe cómo todavía tendrá un problema con la alternancia de punto medio:
for ($i = 0; $i < 1.01; $i += 0.05) { printf "%.1f ",$i} 0.0 0.1 0.1 0.2 0.2 0.2 0.3 0.3 0.4 0.4 0.5 0.5 0.6 0.7 0.7 0.8 0.8 0.9 0.9 1.0 1.0
No culpes a Perl. Es lo mismo que en C. IEEE dice que tenemos que hacer esto. Los números de Perl cuyos valores absolutos son enteros debajo
2**31
(en máquinas de 32 bits) funcionarán más o menos como enteros matemáticos. Otros números no están garantizados.
printf
si desea el resultado en una variable, usesprintf
... espero que esto le ahorre algo de tiempo de depuraciónint()
en PDL?Si bien no está en desacuerdo con las respuestas complejas sobre las marcas a mitad de camino, etc., para el caso de uso más común (y posiblemente trivial):
my $rounded = int($float + 0.5);
ACTUALIZAR
Si es posible
$float
que sea negativo, la siguiente variación producirá el resultado correcto:my $rounded = int($float + $float/abs($float*2 || 1));
Con este cálculo, -1.4 se redondea a -1 y -1.6 a -2, y el cero no explotará.
fuente
Puedes usar un módulo como Math :: Round :
O puedes hacerlo de la manera cruda:
fuente
Si decide usar printf o sprintf, tenga en cuenta que usan la mitad redonda para igualar el método.
fuente
Ver perldoc / perlfaq :
fuente
No necesitas ningún módulo externo.
Puede que me esté perdiendo su punto, pero pensé que esta era una forma mucho más limpia de hacer el mismo trabajo.
Lo que esto hace es recorrer cada número positivo en el elemento, imprimir el número y el entero redondeado en el formato que mencionó. El código concatena el entero positivo redondeado respectivo solo en función de los decimales. int ($ _) básicamente redondea el número para que ($ -int ($ )) capture los decimales. Si los decimales son (por definición) estrictamente menores que 0.5, redondee el número hacia abajo. Si no, redondee agregando 1.
fuente
Lo siguiente redondeará los números positivos o negativos a una posición decimal dada:
fuente
A continuación se muestra una muestra de cinco formas diferentes de sumar valores. La primera es una forma ingenua de realizar la suma (y falla). El segundo intenta usarlo
sprintf()
, pero también falla. El tercero usa consprintf()
éxito mientras que los dos últimos (4to y 5to) lo usanfloor($value + 0.5)
.Tenga en cuenta que
floor($value + 0.5)
se puede reemplazar conint($value + 0.5)
para eliminar la dependenciaPOSIX
.fuente
Los números negativos pueden agregar algunas peculiaridades que las personas deben tener en cuenta.
printf
los enfoques de estilo nos dan números correctos, pero pueden dar lugar a algunas pantallas extrañas. Hemos descubierto que este método (en mi opinión, estúpidamente) pone un-
signo de si debería o no debería. Por ejemplo, -0.01 redondeado a una posición decimal devuelve un -0.0, en lugar de solo 0. Si va a hacer elprintf
enfoque de estilo y sabe que no quiere decimal, use%d
y no%f
(cuando necesita decimales, es cuando el la pantalla se torna inestable).Si bien es correcto y para las matemáticas no es gran cosa, para mostrar simplemente se ve raro mostrando algo como "-0.0".
Para el método int, los números negativos pueden cambiar lo que desea como resultado (aunque hay algunos argumentos que pueden hacerse son correctos).
Esto
int + 0.5
causa problemas reales con los números negativos, a menos que quieras que funcione de esa manera, pero imagino que la mayoría de las personas no lo hacen. -0.9 probablemente debería redondearse a -1, no a 0. Si sabe que desea que lo negativo sea un techo en lugar de un piso, puede hacerlo de una sola línea, de lo contrario, es posible que desee utilizar el método int con un menor modificación (esto obviamente solo funciona para recuperar números enteros:fuente
Mi solución para sprintf
fuente
Si solo le interesa obtener un valor entero de un número entero de coma flotante (es decir, 12347.9999 o 54321.0001), este enfoque (prestado y modificado desde arriba) hará el truco:
fuente
Muchos expertos sugieren escribir sus propias rutinas de redondeo, ya que la versión 'enlatada' proporcionada con su idioma puede no ser lo suficientemente precisa o contener errores. Sin embargo, imagino que están hablando muchos decimales, no solo uno, dos o tres. Con eso en mente, aquí está mi solución (aunque no EXACTAMENTE lo solicitado, ya que mis necesidades son mostrar dólares; sin embargo, el proceso no es muy diferente).
fuente
if ($digit3 >= 5) { $digit3 = 0; $digit2++; if ($digit2 > 9) { $digit2 = 0; $digit1++; if ($digit1 > 9) { $digit1 = 0; $cost[0]++; } } }
así es:if ($digit1 >= 5) { $digit1 = 0; $cost[0]++; }
entonces soloreturn commafied($cost[0]);
fuente