1
votes

Double avec la quantité personnalisée zéro après le point

J'ai deux valeurs Integer et je dois créer une valeur Double en combinant ces deux valeurs de la manière suivante:

A.CB

où:

A - première valeur entière B - deuxième valeur entière C - zéro correspondant à la longueur totale

Fondamentalement, CB doit toujours comporter 9 chiffres au total, c'est-à-dire lorsque B = 1 j'ai besoin que C soit < code> 8 zéro, si B = 100 j'ai besoin de C sera 6 zéro. Pour obtenir ces résultats: 15.000000001 et 17.000000100

Quelle est la meilleure façon d'aborder cette logique dans le code? Je veux dire que je peux écrire une méthode personnalisée pour créer cette logique, mais Java a-t-il déjà quelque chose pour ce cas à simplement l'utiliser, sans créer de méthodes personnalisées? Mieux vaut si c'est possible sans utiliser les fonctions de format de chaîne (pour ne pas convertir les valeurs Integer en String).


1 commentaires

Si vous ne souhaitez pas convertir en String, vous aurez un problème chaque fois que B se termine par un ou plusieurs zéros. Vous ne pouvez pas définir la précision d'un Double sur un nombre spécifié de chiffres décimaux, car les valeurs à virgule flottante n'ont pas de chiffres décimaux (elles ont des chiffres binaires). Donc, si vous voulez arrondir / tronquer à un nombre spécifique de chiffres, vous devrez convertir en quelque chose avec une base décmiale, via BigDecimal ou DecimalFormat . (Ou à une chaîne.)


3 Réponses :


2
votes

Divide b / 1000000000.0 :

12.000000123

Imprime:

int a = 12;
int b = 123;
double x = a + b / 1000000000.0;
System.out.println(x);

Sauf b est supérieure à 9 chiffres, vous obtiendrez ce que vous voulez.


4 commentaires

Obtenir 17.000000100 comme résultat n'est pas possible avec votre solution. Il renverra 17.0000001 pour a = 17 et b = 100 .


@SamuelPhilipp c'est un problème de formatage et comme le veut l'OP: * si c'est possible sans utiliser les fonctions de format de chaîne *


Oui, mais sans ce n'est pas possible je pense.


Bien sûr, ce n'est pas possible. Le problème peut être résolu jusqu'au point du calcul de la valeur double. La représentation de la valeur sera faite par l'OP.



3
votes

Quelque chose comme ça?

123.000000450

L'imprimera

    int A = 123, B = 450;
    System.out.println(String.format("%.09f", A + 1e-9 * B));

P.S. String.format est requis en raison de votre exigence de fin de zéros après la virgule. Ces zéros n'existent pas réellement, vous avez donc besoin d'un moyen de remplir votre sortie, et String.format est un moyen pratique de le faire. Si vous voulez juste une valeur double , vous n'avez pas besoin de String.format.


2 commentaires

Sauf que OP dit: "Mieux vaut si c'est possible sans utiliser les fonctions de format de chaîne"


17.000000100 et 17.0000001 sont des valeurs à virgule flottante identiques. C'est seulement un "problème" si OP veut afficher un nombre spécifique de chiffres, ce qui implique une forme de conversion en String .



0
votes
int a = 12;
int b = 123;

// How many digits in b?
int blen = (int)Math.log10(b);

// Make a string of zeros
String padding = "00000000".substring(blen);

System.out.println(a + "." + padding + b);
This will fail apart if b is very large, as blen will be larger than the padding, and so substring will fail.  Also, negative b will mess things up.

0 commentaires