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:
Solo dale la vuelta:
Convierta el tipo doble al tipo BigDecimal.
- 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. - 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. - 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")
.
Al usar la codificación IDEA, aparecerá un mensaje de advertencia:
我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿。