Saltar al contenido

¿Cómo se redondea un número de punto flotante en Perl?

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 hacia 0. Para redondear a un cierto número de dígitos, sprintf() o printf() 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, el Math::Trig El módulo (parte de la distribución estándar de Perl) implementa las funciones trigonométricas. Internamente utiliza el Math::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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *