Computadora de programación Java, encontró resultados extraños, encuentre la razón
Esta pregunta implica una cuestión de precisión. Los tipos de números de coma flotante simples float y double en Java no se pueden operar. No solo Java, también existen problemas similares en muchos otros lenguajes de programación
Solución
Ahora podemos resolver este problema. El principio es usar BigDecimal y asegurarnos de usar String. .
Le damos un ejemplo de código simple: import?java.math.BigDecimal;
/** *? Dado que los tipos simples de Java no pueden operar con precisión en números de punto flotante, esta clase de utilidad proporciona operaciones precisas de punto flotante, incluidas suma, resta, multiplicación, división y redondeo. */
public?class?Arith{
//Precisión de operación de división predeterminada
private?static?final?int?DEF_DIV_SCALE?=?10;
//No se puede crear una instancia de esta clase
private?Arith(){
}
/** *?Proporciona una operación de suma precisa . *?@param?v1?Addend*?@param?v2?Addend*?@return?Suma de dos parámetros*/
public?static?double?add(double?v1, double?v2) {
¿BigDecimal?b1?=?new?BigDecimal(Double.toString(v1));
BigDecimal?b2?=?new?BigDecimal(Double.toString (v2)) ;
return?b1.add(b2).doubleValue();
}
/** *?Proporciona una operación de resta precisa. *?@param?v1?Minuend*?@param?v2?Minuend*?@return?La diferencia entre los dos parámetros*/
public?static?double?sub(double?v1, double? v2){
BigDecimal?b1?=?new?BigDecimal(Double.toString(v1));
BigDecimal?b2?=?new?BigDecimal(Double.toString (v2) ));
return?b1.subtract(b2).doubleValue();
}?
/** *?Proporciona una operación de multiplicación exacta. *?@param?v1?Multiplicand*?@param?v2?Multiplier*?@return?El producto de dos parámetros*/
public?static?double?mul(double?v1, double?v2 ){
¿BigDecimal?b1?=?new?BigDecimal(Double.toString(v1));
BigDecimal?b2?=?new?BigDecimal(Double.toString (v2) );
return?b1.multiply(b2).doubleValue();
}
/** *? Proporciona precisión (relativamente) cuando se realiza la división. La operación no se puede completar, el cálculo tiene una precisión de *? 10 dígitos después del punto decimal y los números posteriores se redondearán.
*?@param?v1?Divisor*?@param?v2?Divisor*?@return?Cociente de dos parámetros*/
public?static?double?div(double?v1,double?v2 ) {
return?div(v1,v2,DEF_DIV_SCALE);
}
/** *? Proporciona operaciones de división (relativamente) precisas. Cuando se produce una división inagotable, la precisión se especifica mediante el parámetro de escala *? y los números posteriores se redondean. *?@param?v1?Divisor *?@param?v2?Divisor *?@param?scale? significa que debe tener una precisión de varios decimales. *?@return?Cociente de dos parámetros*/
public?static?double?div(double?v1,double?v2,int?scale){
if(scale < 0){
throw?new?IllegalArgumentException(
"¿La?escala?debe?ser?un?entero?positivo?o?cero");
>}
¿BigDecimal?b1?=?new?BigDecimal(Double.toString(v1));
BigDecimal?b2?=?new?BigDecimal(Double.toString(v2) );
return?b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
/** *?Proporcionado Preciso Se maneja el redondeo de decimales. *?@param?v?El número que se debe redondear*?@param?scale?¿Cuántos decimales se deben conservar?*?@return?El resultado después del redondeo*/
public?static? double?round(double ?v,int?scale){
if(scale<0){
throw?new?IllegalArgumentException(
"¿El? ¿escala?debe?ser ?un?entero?positivo?o?cero");
}
BigDecimal?b?=?new?BigDecimal(Double.toString(v)) ;
BigDecimal?one?=?new?BigDecimal("1");
return?b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
public?static?void?main(String[]?args)?{
System.out.println(mul(3.3,3)) ;;
}
}
El resultado de la ejecución es:
Cumplir con los requisitos de la calculadora