Les mathématiques.tour de Diviser le problème avec une valeur de type long
J'ai un problème avec la division d'une valeur de type long par 1 000 et arrondir à un nombre entier.
Ma longue valeur est: 1313179440000
Mon code est
long modificationtime = 1313179440000;
Math.round(modificationtime/1000l)
Si j'ai imprimer le divise et le formatage de la valeur, il me renvoie:
1313179392
.
value : 1313179440000
expected: 1313179440
got : 1313179392
Je ne sais pas pourquoi cela se produit.
Quelqu'un peut-il m'aider?
meilleures salutations,
prdatur
Qui ne fait pas de la compilation; ce qui fait votre code ressemblent réellement?
ajouter un
Cela dépend-il du compilateur? Le mien donne juste une erreur sur cette ligne.
monstre que Vous avez raison. C'est ce que je reçois de changement de langue.
ajouter un
l
à la fin de 1313179440000
si elle est interprétée comme une valeur de type longCela dépend-il du compilateur? Le mien donne juste une erreur sur cette ligne.
monstre que Vous avez raison. C'est ce que je reçois de changement de langue.
OriginalL'auteur prdatur | 2011-08-26
Vous devez vous connecter pour publier un commentaire.
Math.round(float)
est utilisé. Un flotteur, d'une plus grande gamme qu'un long, mais il ne peut pas représenter tous les nombres entiers à l'intérieur de cette gamme, dans ce cas le nombre entier 1313179440 (le résultat original de la division) se trouve dans la partie de la plage qui dépasse entier précision.Ne pas utiliser
Math.round
comme il n'est pas nécessaire (l'entrée est déjà un entier!), ou;Utilisation
Math.round(double)
, comme dans:Math.round(modificationTime/1000d)
. Notez que le diviseur est un double et donc les dividendes (et le résultat) de l'expression sont également encouragées à double.Heureux de codage.
OriginalL'auteur
La raison pour laquelle vous obtenez ce résultat est que
Math.Round()
acceptedouble
. Depuis votre numéro n'est pas exactement représentable comme undouble
, le nombre le plus proche qui est est transmis.Noter que
round()
est complètement inutile ici.modificationTime/1000l
nécessite pas d'arrondi. Si vous ne nécessitent un arrondissement, changer l'argument demodificationTime/1000d
.OriginalL'auteur dlev