2012-05-10 2 views
4

je dois garder la granularité dans un travail flou je donc fait une fonction qui reçoit comme paramètres:fonction Java pour préserver la granularité

  • la granularité (double entre 0 et 1, 0 non inclus)
  • la valeur de transformer, si nécessaire (il est un double supérieur à 0)

et retourne une nouvelle valeur avec la granularité correcte.

Ceci est la fonction I ai:

public static double preserveGranularity(double granul, double value){ 
    double integerValue= (double)(int)value; 
    if(granul == 1) 
     return integerValue; 
    double decimal = value - integerValue; 
    long factor = Math.round(decimal/granul); 
    return integerValue + granul*factor; 
} 

Exemples:

  • preserveGranularity (0,25, 7,7) doit renvoyer 7,75
  • preserveGranularity (0,01, 0,009) doit retourner 0,01

Cela fonctionne bien pour la plupart des valeurs, mais pas pour tous (par exemple: preserveGranulari ty (0,2, 0,57) = 0,6000000000000001, il doit retourner 0,6)

salutations

P.S. Désolé pour toute erreur que j'ai faite dans cette question, c'est ma première ici

+0

Il n'y a pas vraiment de différence entre '0.6000000000000001' et' 0.6' –

+0

Cela ressemble à une erreur d'arrondi de base 2-> 10 pour moi. – Riking

+0

C'est une erreur minimale, mais cela cause des problèmes. @Riking Je pense la même chose mais comment puis-je le réparer? –

Répondre

4

Vous ne pouvez pas réaliser cela avec double - car ce n'est pas assez précis.
double s ne sont pas des nombres réels. Il y a seulement un nombre fini de bits pour les représenter - alors qu'il y a un nombre infini de nombres réels (ou même rationnels) là-bas, donc ces erreurs d'arrondi sont attendues. Je pense que vous cherchez BigDecimal, qui vous permet de contrôler la granularité, comme vous le souhaitez, par exemple avec sa méthode round().

+0

Ok. J'essaye avec BigDecimal je ne le savais pas, merci. –

1

Les calculs de virgule flottante ne sont pas exacts (l'ordinateur ne peut représenter que trop de chiffres). Cela signifie que quelque part dans vos opérations de division/multiplication/arrondi/soustraction/addition vous perdez de la précision.

Questions connexes