9
votes

Combien de décimales dans un double (Java)

Y a-t-il une fonction intégrée de Java pour me dire combien de décimales dans un double. Par exemple:

101.13 = 2
101.130 = 3
1.100 = 3
1.1 = 1
-3.2322 = 4 etc.


0 commentaires

7 Réponses :


6
votes

Le nombre de décimales dans un double est de 16.

numéros 64 bits. Mantissa 52 bits. 52 bits est d'environ 16 chiffres décimaux.

voir http://java.sun.com /docs/books/jls/second_edition/html/typesvalues.doc.html .

Double, dont les valeurs incluent les nombres de points flotatifs IEEE 754 64 bits.

Voir http://fr.wikipedia.org/wiki/eeee_754-2008


8 commentaires

Non, c'est le nombre de Decimal chiffres, et c'est faux, c'est 15,9. Considérons "123456789012345". Quinze chiffres décimaux, zéro décimal. "12345678901234.5". Quinze chiffres décimaux, un endroit décimal. Etc.


@EJP: Je penserais que 15.9 est "environ 16". Il apparaît de votre commentaire que vous ne pensez pas que 15.9 est "environ 16". Si vous souhaitez réclamer 15.9 n'est pas "environ 16", alors vous avez tort aussi, car ce n'est pas 15,9, non plus. Wikipedia dit "17 chiffres décimaux" et 15,955 chiffres.


Ensuite, vous et Wikipedia sont faux. En ce qui concerne les chiffres décimaux, 15,9 est sur 15, parce que vous ne pouvez pas compter sur le 16ème chiffre d'être là. Et ce n'est certainement pas 17.


@EJP: Veuillez lire attentivement la norme IEEE. En particulier, lisez les bits implicites dans le signaland.


Il y a 53 morceaux de mantista. C'est 53 chiffres binaires, ce qui est à son tour de 15,9 chiffres décimaux. Une partie du temps que vous obtenez 16; la plupart des mètres du temps ne le font pas. Si vous mettez en œuvre une précision de 16 chiffres décimaux, 15,9 ne suffisent pas.


Ok, nous ne faisons que voler ici, mais c'est 15.9545897701910000. À 16 décimales ;-)


@EJP: Non. Nous ne sommes pas enlevés. Votre commentaire initial était clair. "environ 16 est faux". Et puis vous avez affirmé que c'était 15,9, ce qui est également faux. Vous n'apparaissez pas qu'il aime. Vous semblez avoir quelque chose d'important à dire et vous avez répété que quelque chose d'important maintenant quatre fois séparément. Ce n'est pas un eribing. Vous avez quelque chose important à ajouter à cette réponse. Quelque chose à peu près 16 n'étant même pas près de 15,955.


Peut-être que vous pourriez fournir la formule pertinente: chiffres décimales = bits de chiffres * log10 (base) et pointez sur la table ici .



10
votes

NO.

1.100 et 1.1 sont exactement la même valeur (elles sont représentées exactement le même bit-for-bit dans un double ).

Par conséquent, vous ne pouvez jamais obtenir ce genre d'informations à partir d'un double .

La seule chose que vous peut est pour obtenir le nombre minimum de chiffres décimaux nécessaires à un nombre décimal à analyser dans la même valeur double . Et c'est aussi simple que d'appeler double.tostring () et de vérifier combien de chiffres décimaux il y a.


2 commentaires

Appelant Tostring () semble un peu shakey mais ma pensée initiale.


@Karl: C'est Shaky , mais peut-être la meilleure chose à faire. Il se casse pour des valeurs très grandes et très petites (comme vous obtiendrez une notation scientifique). La seule solution 100% correcte consiste à faire ce test lorsque vous avez la valeur en tant que chaîne avant , vous le convertissez en un double (comme Andrei démontre).



15
votes

Vous pouvez utiliser bigdecimal.scale () si vous passez le numéro sous forme de chaîne comme celle-ci: xxx

mais si vous avez déjà le numéro sous forme de chaîne, vous pouvez aussi bien analyser la chaîne Avec une regex pour voir combien de chiffres il y a: xxx

à l'aide de BigDecimal peut avoir l'avantage de vérifier si la chaîne est en réalité un nombre; Utilisation de la méthode de chaîne, vous devez le faire vous-même. En outre, si vous avez les chiffres comme double que vous ne pouvez pas différencier entre 1.31 et 1.310 (ils sont exactement le même double) comme les autres ont également signalé. < / p>


0 commentaires

4
votes

Non, il n'y a pas de fonction intégrée que je connaisse.

Il y a un moyen simple de le faire, cependant. Double.Tostring vous donnera une chaîne contenant tous les chiffres décimaux significatifs dans le double. Voici quelques propriétés de cette chaîne:

  • la chaîne que les résultats peuvent être en notation décimale ou scientifique Notation, en fonction de la valeur du double.
  • doubles qui convertissent des décimales de 10 000 000 ou plus ou plus petites que 1/1000 résultat en notation scientifique. Sinon, ils sont en décimal Notation.

    Utiliser Double.Tostring Pour comprendre le nombre de décimaux, il comprend essentiellement combien de chiffres significatifs à droite du point décimal moins une exposant de notation scientifique, s'il y en a un. La notation décimale aura toujours au moins un chiffre à droite du point décimal et au moins un chiffre à gauche du point décimal, même s'il s'agit d'un zéro. Puisque nous sommes préoccupés par des lieux décimaux pour des chiffres significatifs, un zéro traînant au droit du point décimal est une préoccupation et ne doit pas être compté comme un lieu décimal.

    Le code suivant passera un bon calcul pour vous: xxx

    J'ai quelques questions sur la question posée. Quel type de précision est attendu avec la représentation décimale d'un double? Les doubles sont-ils utilisés pour effectuer de manière inappropriée des calculs décimaux? Les calculs décimaux avec des fractions décimales utilisant des flotteurs et des doubles peuvent avoir des résultats présentant de manière inattendue 16 ou 17 chiffres significatifs et ne sont peut-être que des approximations des résultats attendus des calculs décimaux équivalents.

    Un aspect du flotteur, des doubles, de longs doubles (AKA quads) qui semble programmer des programmeurs et des concepteurs Stymie sont que tous ces formats sont réellement stockés en tant que nombres fractionnaires binaires qui ne peuvent que des nombres décimaux approximatifs que pour un très, Très peu de chiffres, dont la plupart sont assez proches des valeurs 1, -1, plus la valeur zéro. Comme on progresse vers l'infini positif ou zéro de 1, ou vers l'infini négatif ou zéro de -1, la portée de l'approximation deviendra apparente.

    Presque toutes les fractions décimales n'ont aucune représentation directe dans les flotteurs et les doubles. Seules des fractions décimales pouvant être comprises à partir de la somme d'une combinaison de la série de fractions suivante ont une représentation exacte:

    1, 1/2, 1/4, 1/8, 1/16, 1 / 32, 1/64, 1/128, 1/256, ..., 1/4503599627370496

    Tous les autres sont des approximations.

    entiers supérieurs à +9007199254740992 ou moins de -9007199254740992 Peut ne pas avoir une représentation exacte et la paternité augmente de manière exponentielle car les entiers augmentent au-dessus de la valeur positive ou de diminution inférieure aux valeurs négatives, respectivement.

    Une autre façon de regarder cela est de réaliser que IEEE 64 bits doubles , Normalisé, approximatif, des nombres décimaux positifs et négatifs positifs et négatifs ayant des valeurs absolues allant de 2.225073858507201400 E -308 à 1.797693134862315700 E +308. Cependant, il n'y a que des valeurs 1.84446744073709551616 E +19 disponibles pour ces approximations. Cela signifie environ 1,0 E +607 Valeurs décimales Partager une représentation avec d'autres valeurs décimales qui sont plus étroitement approchées d'un double.

    Le comportement des flotteurs et des doutes en doule des ravages avec des calculs décimaux nécessitant une précision décimale exacte, telle En tant que calculs financiers et que c'est pourquoi, sauf si une approximation de haute précision n'est acceptable, il faut utiliser des entiers à échelle et des longs, ou des classes telles que BigInteger et BigDecimal, pour des calculs nécessitant une précision décimale exacte, une arrondi et une précision.


0 commentaires

3
votes
// ****************************************************************
public int getDecimals(double doubleValue) {
// ****************************************************************
    BigDecimal bd1 = new BigDecimal(Double.toString(doubleValue)).stripTrailingZeros();
    return bd1.scale();
}

1 commentaires

La partie de tostring est cruciale.



-1
votes
StringBuffer stringBuffer = new StringBuffer(Double.toString(ratioGrossYield));
int i; // general purpose character index
int exponent;
int decimalPlaces;
if ((i = stringBuffer.indexOf("E")) > -1) { // scientific notation...
    // turn scientific notation exponent into an integer
    exponent = Integer.parseInt(stringBuffer.substring(i + 1));
    // truncate the exponent from the StringBuffer
    stringBuffer = stringBuffer.delete(i, stringBuffer.length());
} else { // decimal notation, could be trailing zero
    exponent = 0; // no exponent, so zero
    // point i to trailing zero and truncate it, if there is one
    if (stringBuffer.charAt((i = stringBuffer.length() - 1)) == '0') {
        stringBuffer = stringBuffer.deleteCharAt(i); // delete trailing zero
    }
}
// stringBuffer now contains only significant digits to the
// right of the decimal point, if there are any
decimalPlaces = stringBuffer.length() - 1 - stringBuffer.indexOf(".") - exponent;
// zero or positive number is decimal places
// negative number is number of zeroes to the left of the decimal point
// between the decimal point and the least significant digit
if (stringBuffer.charAt(stringBuffer.length() - 1) == '0') {

    return decimalPlaces-1;

} else {

    return decimalPlaces;
}

0 commentaires

1
votes

De nombreuses années il y a de nombreuses années, je me souviens d'une réponse de 16 chiffres, au total d'avant et après le point décimal.

J'ai écrit un petit peu de code pour tester cela. P>

public class test {
    public static void main(String[] args) {
        double x;`enter code here`
        x = 3411.999999999999;
        System.out.println("16: "+x);   // gives 3411.999999999999
        x = 3411.9999999999999;
        System.out.println("17: "+x);   // gives 3412.0
        x = 0.9999999999999999;
        System.out.println("16: "+x);   // gives 0.9999999999999999
        x = 0.99999999999999999;
        System.out.println("17: "+x);   // gives 1.0
    }  
}


0 commentaires