Tenga en cuenta el uso de new BigDecimal (doble valor)

Bienvenido a seguir la cuenta pública de WeChat del autor: Programación de coco

Ejecuté la prueba unitaria esta tarde e informé un error, y encontré un problema de código sobre el nuevo BigDecimal (doble valor).

pregunta

Código comercial:

/**
 * 校验价格是否一致
 *
 * @param frontPrice 前端商品价格
 * @param realPrice  商品系统价格
 * @return boolean  true 相等
 */
public static boolean comparePrice(BigDecimal frontPrice, BigDecimal realPrice) {
    return frontPrice.compareTo(realPrice) == 0;
}
复制代码

Código de prueba:

/**
 * 前端价格
 */
BigDecimal forntPrice = new BigDecimal(0.2);
复制代码

Luego pruebe el método comparePrice siempre devuelve false, frontPrice y realPrice son obviamente iguales, ambos son 0.2.

Después de solucionar el problema, se encuentra que el valor de frontPrice no es 0.2, sino 0.200000000000000011102230246251565404236316680908203125 .

Maldición, ¿cómo sucede esto? ¿BigDecimal no es una operación exacta?

resolver

Consulte la documentación relacionada:

Bigdecimal-doc.png

Solo dale la vuelta:

Convierta el tipo doble al tipo BigDecimal.

  1. El resultado de este constructor es algo impredecible. Puede pensar new BigDecimal(0.1)que crea un BigDecimal que es exactamente igual a 0.1, pero en realidad es igual a 0.1000000000000000055511151231257827021181583404541015625. Esto se debe a que 0,1 no se puede representar exactamente como un doble.
  2. El constructor String es completamente predecible, new BigDecimal("0.1")creando un BigDecimal exactamente igual a 0.1, y se recomienda usar el constructor String de preferencia.
  3. Si debe usar el doble como fuente de conversión, puede usarlo BigDecimal.valueOf(0.1)y el resultado que devuelve es preciso.

Resumir

Al convertir un tipo doble en un tipo BigDecimal, no utilice new BigDecimal(0.1)este constructor, ya que el resultado que obtiene es impreciso.

Usa BigDecimal.valueOf(0.1)o new BigDecimal("0.1").

BigDecimal-example.png

Al usar la codificación IDEA, aparecerá un mensaje de advertencia:

Bigdecimal-idea.png

我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿

Supongo que te gusta

Origin juejin.im/post/7122734648517459976
Recomendado
Clasificación