Empêcher la notation d'exposant (E) d'apparaître lorsque toString of Java Big Decimal

environnement

Java 8 SpringBoot 1.5.10 Jackson Core 2.8.10

phénomène

Si vous appelez toString en utilisant le type BigDecimal, la notation exponentielle (E) peut apparaître. Quand je l'ai essayé dans mon environnement, il est parti de 0,1 et est resté tel quel de 0,1 à 0,000001 (10 à la 6e puissance), mais à partir de 0,0000001 (10 à la 7e puissance), la notation exponentielle (E) est apparue.

BigDecimal fieldA = new BigDecimal("0.000001"); // .toString()Puis 0.000001
BigDecimal fieldB = new BigDecimal("0.0000001"); // .toString()Puis 1E-7

Pour connaître les critères d'affichage de la notation exponentielle (E), consultez BigDecimal.toString Document Pour plus de détails, veuillez vous y référer.

Correspondance

Si vous utilisez toPlainString au lieu de toString, il crachera tel quel.

BigDecimal fieldA = new BigDecimal("0.0000001"); 
System.out.println(fieldA.toString()); // -> 1E-7
System.out.println(fieldA.toPlainString()); // -> 0.0000001

Je veux PlainString lorsque j'utilise Jackson

Si vous utilisez Jackson pour convertir un objet Java en JSON, le comportement par défaut est toString, donc la notation exponentielle (E) apparaîtra pour certains nombres. Pour éviter cela, assurez-vous que toPlainString est appelé à la place de toString Réglage WRITE_BIGDECIMAL_AS_PLAIN Il existe .0 / com / plus rapidexml / jackson / core / JsonGenerator.Feature.html # WRITE_BIGDECIMAL_AS_PLAIN). (D'après Jackson 2.3)

Dans le cas de Spring Boot, ce n'est pas grave si vous écrivez les paramètres suivants dans ʻapplication.yml`.

spring:
  jackson:
    generator:
      write_bigdecimal_as_plain: true

De côté

Notez que si vous utilisez jq, il sera converti dans un format utilisant des exposants. Quand j'ai vérifié l'opération, je l'ai recourbée depuis le terminal, je l'ai formatée avec jq et je l'ai vérifiée, donc j'étais un peu accro.

#e apparaît lors de l'utilisation de jq
$ curl localhost:8081 | jq
{
  "fieldA": 1e-53,
  "fieldB": 9e-15
}

#e n'apparaît que si jq est utilisé
$ curl localhost:8081     
{"fieldA":0.000001,"fieldB":0.0000001}

Recommended Posts

Empêcher la notation d'exposant (E) d'apparaître lorsque toString of Java Big Decimal
[Java] Conseils et problèmes d'erreur lors de la conversion du double en grand décimal
Java Big Decimal
[Java] Utilisez correctement Big Decimal ~ 2018 ~