Pregunta

Según Wikipedia al redondear un número negativo, se redondea el número absoluto. Entonces, por ese razonamiento, -3.5 se redondearía a -4. Pero cuando uso java.lang.Math.round (-3.5) devuelve -3. ¿Alguien puede explicar esto?

¿Fue útil?

Solución

Según el javadoc

  

Devuelve el largo más cercano al   argumento. El resultado se redondea a un   entero agregando 1/2, tomando el   piso del resultado, y echando el   resultado para escribir largo. En otras palabras,   el resultado es igual al valor de   la expresión:

     

(largo) Math.floor (a + 0.5d)

Conceptualmente, redondeas hacia arriba . En otras palabras, al siguiente número entero mayor que el valor y -3 es mayor que -3.5, mientras que -4 es menor.

Otros consejos

Hay una variedad de métodos de redondeo; el que estás viendo se llama redondeo aritmético simétrico (como se dice). La sección a la que se refiere afirma: `` Este método se usa comúnmente en aplicaciones matemáticas, por ejemplo, en contabilidad. Es el que generalmente se enseña en las clases de matemáticas elementales. Esto parece reconocer que no es una regla acordada globalmente, solo la que es más común.

Personalmente, no recuerdo haber sido enseñado esa regla en la escuela. Mi comprensión del redondeo siempre ha sido que .5 se redondea, independientemente del signo del número. Aparentemente, los autores de Java tienen la misma comprensión. Este es el redondeo aritmético asimétrico.

Diferentes herramientas e idiomas pueden usar diferentes esquemas de redondeo. Aparentemente, Excel usa el método simétrico.

(En general, le aconsejaría que si encuentra un conflicto entre Wikipedia y la experiencia, busque información en otra parte. Wikipedia no es perfecta).

Para lo que vale, java.math.BigDecimal tiene modos de redondeo seleccionables si necesita más control sobre ese tipo de cosas.

El artículo de Wikipedia que cita no dice que esa es la única forma de redondear, sino la forma común de redondear. También se mencionan en ese artículo varias alternativas (desafortunadamente ninguna de las cuales describe el método de redondeo de Java, a pesar de que lo llaman "redondeo aritmético asimétrico" cuando indican lo que hace JavaScript).

Debe decidir cómo desea redondear sus números y luego usar ese método. Si la implementación de Java coincide con eso, entonces genial. de lo contrario, deberá implementarlo usted mismo.

De acuerdo con Javadocs:

Devuelve el long más cercano al argumento. El resultado se redondea a un número entero agregando 1/2, tomando el piso del resultado y emitiendo el resultado para escribir long . En otras palabras, el resultado es igual al valor de la expresión:      

(long)Math.floor(a + 0.5d)

Resulta que la convención es redondear. Supongo que Wikipedia es falible. Sin embargo, Microsoft se equivocó, ya que también lo redondearon a -4, lo cual no es una convención (lo verifiqué con alguien que tiene un doctorado en matemáticas).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top