2013-07-30 2 views
0

J'ai un fichier que je veux diviser en 100 pièces.
La taille du fichier est 257019 octets.
Lors de l'exécution de mon code de séparateur ci-dessous, j'obtiens 99 parties avec une taille de 2545 octets et la dernière 100ème partie est de 5064 octets.Diviser le nombre en parties égales où la dernière partie est égale ou inférieure au reste

je besoin d'aide pour savoir comment faire les premiers 99 parties ayant la même taille et la dernière partie 100'th ayant les octets restants qui est égale ou inférieure puis 2545.

int partSize; 
for(partSize=1 ;partSize< 257019; partSize++){ 
    if((int) Math.ceil(257019/partSize) == 100){ 
    break; 
    } 
} 

int totalparts = (int) Math.ceil(257019/partSize); // =100 
+1

avez-vous essayé 'Math.ceil (257019.0/partSize) == 100)'? – bas

+0

Quelle est la raison pour laquelle vous ne pouvez pas utiliser la commande linux/gnu 'split'? –

+0

Im dans win7 eclipse faisant cela, comment puis-je ajouter le .0, double conversion. – Erik

Répondre

4
int fileSize = 257019; 
int partSize = Math.ceil(((double)fileSize)/100); 
int lastPacket = 257019 - (99 * partSize); 

Dans ce cas:

int partSize = 2571; 
int lastPacket = 257019 - 254529 = 2490 < 2571 

Le problème d'origine avec votre code:

(int) Math.ceil(257019/partSize) == 100 

est que 257019/partSize est évalué avant que Math.ceil soit évalué. Si vous divisez un nombre entier par un nombre entier, le résultat est automatiquement un nombre entier. Le comportement par défaut d'un entier est d'omettre tout sauf la décimale elle-même, donc il sera automatiquement "Math.floor()".

+0

Ça fonctionne grille – Erik

1
int partSize = totalSize/100; 
if ((totalSize % 100) != 0) { 
    partSize++; 
} 
+0

Pouvez-vous expliquer ce qu'il fait par rapport à la réponse @bas qui a travaillé la grille – Erik

+2

si partSize ne peut pas être entièrement divisé par 100, il va laisser un reste. L'opérateur 'modulus' ('% ') vérifie s'il y a un reste. S'il y a un reste, alors votre partSize devra être d'une taille plus grande (puisque le dernier paquet ne correspond pas). C'est une approche valable et fonctionnelle, bien que technique imho inutile. – bas

+0

L'arithmétique des virgules flottantes ne renvoie pas de résultats exacts. Vous pourriez vous retrouver avec des erreurs d'arrondi. L'arithmétique entière est rapide et précise. –

Questions connexes