2016-06-09 1 views
-1

J'essaie de convertir une valeur double, par ex. 12.55-BigDecimal avec ce code:Comment convertir BigDecimal en Decimal correctement?

BigDecimal unitPrice = new BigDecimal(product.getUnitPrice()); 

En conséquence, je suis quelque chose comme ça 12.550000000000000710542735760100185871124267578125 alors je dois arrondi tout avec ce code:

unitPrice.setScale(2, RoundingMode.HALF_EVEN)

et a obtenu un résultat comme celui-ci 12.55 ce qui est bien. Cependant, quand je vais mettre cela comme un paramètre pour insérer la base de données MySQL avec ce code:

addProduct.setBigDecimal(4, unitPrice.setScale(2, RoundingMode.HALF_EVEN));

Alors quand je le lance, je suis arrivé cette erreur SQL:

Data truncation: Out of range value for column 'price_per_unit' at row 2

Je sais que le problème est dans ce code:

addProduct.setBigDecimal(4, unitPrice.setScale(2, RoundingMode.HALF_EVEN));

comme je l'ai débogué au moment de cette ligne de code, la valeur était

12.550000000000000710542735760100185871124267578125

type MySQL de données de la colonne que j'ai mis était DECIMAL(3,2).

Pourquoi ça ne marche pas même quand je l'ai arrondi? J'ai essayé de chercher une solution et je ne trouve rien de pertinent. Comment définissez-vous vraiment la décimale correctement? Je suppose que tu sais ce que j'essaie de faire. Merci d'avance.

+0

Pourquoi ne retourne une valeur à virgule flottante 'product.getUnitPrice()'? C'est le vrai problème. – EJP

+0

@EJP Renvoie réellement le double. –

+1

['double' * est * point flottant] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.2.3) réellement, et c'est toujours le vrai problème. Vous ne devriez pas avoir à arrondir juste pour stocker dans une base de données. N'utilisez pas de virgule flottante pour de l'argent. – EJP

Répondre

3

Decimal (3,2) signifie que le nombre a un total de trois chiffres, un vers la gauche et deux vers la droite. 12.55 ne correspond pas à cela. Aviez-vous l'intention de stocker trois à gauche? Il serait decimal(5,2)

+0

Oh ouais ... Vous avez raison ... Comment se fait-il que je ne m'en soit pas rendu compte? Merci beaucoup Thomas. C'était juste une solution simple. lol :) –

0

de si vous voulez garder DECIMAL (3,2) le code serait

new BigDecimal(12.55f, new MathContext(3, RoundingMode.HALF_EVEN)).setScale(2);