Ya no busques más por otras webs porque llegaste al sitio indicado, poseemos la respuesta que quieres sin complicarte.
Solución:
Salida de perldoc -q round
¿Perl tiene una función round()? ¿Qué pasa con ceil() y floor()? funciones trigonométricas?
Recuérdalo
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
los
POSIX
módulo (parte de la distribución estándar de Perl) implementa
ceil()
,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 perlas, se hizo trigonometría en el
Math::Complex
módulo. Con 5.004, elMath::Trig
El módulo (parte de la distribución estándar de Perl) implementa las funciones trigonométricas. Internamente utiliza elMath::Complex
módulo y algunas funciones pueden pasar del eje real al plano complejo, por ejemplo, el seno inverso de 2.El redondeo en 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 necesita usted mismo.
Para ver por qué, observe cómo todavía tendrá un problema en 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. Números de Perl cuyos valores absolutos son enteros menores
2**31
(en máquinas de 32 bits) funcionará de manera muy similar a los números enteros matemáticos. Otros números no están garantizados.
Si bien no estoy 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 para su $float
ser 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á.
Puedes usar un módulo como Math::Round:
use Math::Round;
my $rounded = round( $float );
O puedes hacerlo de la manera cruda:
my $rounded = sprintf "%.0f", $float;
Sección de Reseñas y Valoraciones
Recuerda que tienes la capacidad de agregar una reseña si tropezaste tu inconveniente en el momento justo.