4 votes

Comment convertir les 3 derniers chiffres d'un nombre en 0

Comment convertir les 3 derniers chiffres d'un nombre en 0

exemple 3444678 à 3444000

Je peux faire comme

(int)(3444678/1000) * 1000= 3444000

Mais la division et la multiplication peuvent coûter cher...

Toute autre solution ????

0voto

Kent Fredric Points 35592

Si vous souhaitez arrondir à une précision arbitraire et que votre méthode d'arrondi manque de contrôle de précision, cela devrait fonctionner :

En Perl au moins, mod devrait toujours être plus rapide

Voici pourquoi : Un échantillon de ( 10 ** 7 ) * 3 nombres flottants aléatoires a produit cette référence :

Dividing
Time taken was  7 wallclock secs ( 6.83 usr  0.00 sys +  0.00 cusr  0.00 csys =  6.83 CPU) seconds

Multiplying
Time taken was  7 wallclock secs ( 6.67 usr  0.00 sys +  0.00 cusr  0.00 csys =  6.67 CPU) seconds

Modding
Time taken was  8 wallclock secs ( 7.87 usr  0.00 sys +  0.00 cusr  0.00 csys =  7.87 CPU) seconds

Multiply + Dividing
Time taken was 10 wallclock secs (10.18 usr  0.01 sys +  0.00 cusr  0.00 csys = 10.19 CPU) seconds

Il convient toutefois de noter que 10 ** 7 * 3 est un REDICULE nombre de flottants. Je n'ai pas pu utiliser 10**8 les flottants parce que pour un test équitable, je devais utiliser la même séquence de flottants pour tous les tests, et ce nombre de flottants A ÉPUISÉ MES 4G DE MÉMOIRE

Ok, un peu de hors sujet :/

(Implémentation Perl utilisant uniquement Int, qui tronque au lieu d'arrondir normalement)

use strict;
use warnings;
use version;
our $VERSION = qv('0.1');

sub xround { 
    my ( $number, $precision ) = @_ ;
    if ( $precision eq 0 )
    {
        return int( $number + .5 ); 
    }
    my $scale = 10 ** abs( $precision ) ;

    $number = $number / $scale if $precision > 0; 
    $number = $number * $scale if $precision < 0; 

    $number = int( $number + .5 );

    $number = $number * $scale if $precision > 0; 
    $number = $number / $scale if $precision < 0; 
    return $number;
}

my $fmt = "%s : %s  ( %s )\n";
my $n = 55555.55555;
for my $i ( -4 .. 4 )
{

    printf $fmt, $n, xround($n, $i), $i; 
}

.

55555.55555 : 55555.5556  ( -4 )
55555.55555 : 55555.556  ( -3 )
55555.55555 : 55555.56  ( -2 )
55555.55555 : 55555.6  ( -1 )
55555.55555 : 55556  ( 0 )
55555.55555 : 55560  ( 1 )
55555.55555 : 55600  ( 2 )
55555.55555 : 56000  ( 3 )
55555.55555 : 60000  ( 4 )

en utilisant la méthode du module

Cela fonctionne comme ci-dessus, (sauf sans arrondi) en utilisant la méthode modulus pour les ints, mais fonctionne toujours pour l'arrondi en précision flottante (avec un léger ralentissement pour les précisions à droite de la virgule décimale).

use strict;
use warnings;
use version;
our $VERSION = qv('0.1');

sub xround {
    my ( $number, $precision ) = @_;
    my $ino = int( $number );
    if ( $precision eq 0 ) {
        return $ino; 
    }
    my $power = 10**$precision;

    if ( $precision > 0 ) {
        return int( $number - ( $number % $power ) );
    }
    return $ino + int( ( $number - $ino ) / $power ) * $power;
}

my $fmt = "%s : %s  ( %s )\n";
my $n = 55555.55555;
for my $i ( -4 .. 4 )
{
    printf $fmt, $n, xround($n, $i), $i; 
}

.

55555.55555 : 55555.5555  ( -4 )
55555.55555 : 55555.555  ( -3 )
55555.55555 : 55555.55  ( -2 )
55555.55555 : 55555.5  ( -1 )
55555.55555 : 55555  ( 0 )
55555.55555 : 55550  ( 1 )
55555.55555 : 55500  ( 2 )
55555.55555 : 55000  ( 3 )
55555.55555 : 50000  ( 4 )

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X