none
Redondear correctamente los decimales

    Question

  • Tengo las siguientes cantidades:

    90.09 + 5.41 + 25.23 = 120.720721 (segun MS Excel 2010)

    Aplicandole el formato de "Numero" con "2 decimales" se convierte en 120.72

    Ahora bien sumando las mismas cantidades para mostrar el resultado en un textbox obtengo: 120.73

    Estoy asignando el resultado de esta manera:

    A) Math.Round(suma(), 2, MidpointRounding.ToEven)

    B) Format(Math.Round(suma(), 2, MidpointRounding.ToEven),"N")

    y aun asi obtengo 120.73

    Agradeceria cualquier ayuda o sugerencia para poder solucionar este pequeño inconveniente.

    De antemano gracias por su tiempo y sus respuestas.

    Friday, January 13, 2012 6:15 AM

Answers

  • ¿Ves como en las celdas C3:C5 existen valores con más de dos decimales?

    El resultado no es la suma de 90.09 + 5.41 + 25.23; el que tienes que tomar es el resultado de sumar los valores de las celdas C3:C5, que asciende a 120.7207207.

    Si ese número lo deseas redondear, lo harías de la siguiente manera:

      Dim numero As Decimal = 120.7207207D

      Dim numeroRedondeado As Decimal = Math.Round(numero, 2, MidpointRounding.ToEven)

      MessageBox.Show(numeroRedondeado.ToString())

    Ahora el resultado sí será 120.72. Pero desde luego, no esperes que el resultado de sumar 90.09 + 5.41 + 25.23 sea 120.72 porque no es correcto.

    Insisto que ignoro dónde está el problema. ¿?

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    Friday, January 13, 2012 3:10 PM
  • Ahora que acabas de modificar tu mensaje, observo lo que aparece en el control ListView, y obviamente, el importe TOTAL (la cantidad remarcada en color amarillo) no se corresponde con la suma de las cantidades Sub Total e I.V.A.

    Te tienes que limitar a que en la columna Total aparezcan las cantidades únicamente con dos decimales. El valor de 'Sub Total' será la suma de la columna Total, sin redondeos, porque las cantidades deberán de aparecer con dos decimales.

    La cantidad de I.V.A sí la tienes que redondear a 2 decimales, para que la puedas sumar al valor 'Sub Total' y obtener el TOTAL.

       Dim subTotal As Decimal = 120.73D

       ' IVA = 11%
       Dim iva As Decimal = Math.Round(120.73D * 0.11D, 2, MidpointRounding.ToEven)

       Dim total As Decimal = subTotal + iva

       MessageBox.Show(total.ToString())

    El Total será 134,01, que será la suma de 120.73 + 13.28 del IVA.

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    Friday, January 13, 2012 3:24 PM
  • Antes que nada gracias a todos por su tiempo, ayuda y por sus respuestas. Dejo una imagen del problema que planteo al principio:

     

    Y aqui una imagen del formulario de mi aplicacion:

    Como pueden ver la suma deberia dar 120.73 pero excel lo redondea a 120.72 y Visual Basic me arroja 120.73. El detalle es que esas mismas cantidades las obtengo de un ListView y entonces les aplico las mismas operaciones que se muestran en la imagen.

    Saludos y buen dia.


    voy a citar tu mensaje porque el error esta en Excel.

    ¿Porque?

    estoy 100% seguro D3, D4, D5 en excel tu usastes el boton en la barra de herramientas para disminuir los decimales "Decrease decimal"por ende no estar REDONDEANDO y si tu sabes sumar que apuesto a que si, luego de disminuir los decimales que valores tu estas viendo? "90.09, 5.41, 25.23" y que valores tu cerebro te dice que deberia de aparecer en la suma? "120.72" o "120.73"? cuestionate tu mismo.

    ¿Porque?

    porque tu nunca redondeastes las celdas D3, D4 y D5, cierto? o me equivoco?, tu lo que hiciestes fue decirle a excel que en lugar de que te muestre 6 decimales solo te muestre los primeros 2 decimales, aunque el para mostrarte el valor correcto lo redondeo de modo visual, pero nunca cambio los valores de las celdas, Cierto? entonces la suma no se redondeara, dandote como valor 120.72 en lugar de 120.73.

    caso contrario que en lugar de disminuir los decimales hubieras redondeado.

    ejemplo:

    =ROUND(D3,2), que aqui si estas REDONDEANDO por ende la suma deberia ser 120.73.

    asi que para dejarlo claro, el error es visual en Excel, no es que Excel no sepa redondear, es simplemente error visual.

    por ende, lo que mencionan las demas respuestas son correctas.

    espero haberme dado a entender.

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    Friday, January 13, 2012 5:49 PM
  • y agrego aun mas para que quede mas claro, espero!!!!

    90.09009009 si disminuimos los decimales a 2 que te muestra Excel y porque?, te muestra 90.09, porque el siguiente numero al nueve es 0 (cero), cierto? asi que visualmente no redondea a 90.10, si no que lo deja tal cual 90.09

    nomal              | disminuidos los decimales a dos (NO REDONDEADO)

    ---------------------------------------------------------------------------------------------

    90.09009009  | 90.09

    5.405405405  |   5.41 - porque? 5.405 <- termina con 5 y que sucede?

    25.22522523  | 25.23 - porque? 25.225 <- termina con 5 y que sucede?

    ---------------------------------

    120.7207207  | 120.72 <- es correcto este valor SI DISMINUIMOS los decimales?, te marque el 0 en negrillas luego del .72

    ¿ENTONCES?

    donde esta el error?, no hay error, es simplemente error de como se muestra la informacion. no es error de como se calcula la suma porque la suma la hara con todos los decimales.

     

    Salu2,

     

     


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor


    Friday, January 13, 2012 6:15 PM

All replies

  • Hola:
    En un Form con 1 Button, copia y pega el siguiente codigo.

    Public Class Form1

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim ldPrimero As Double = 90.09
            Dim ldSegundo As Double = 5.41
            Dim ldTercero As Double = 25.23
            Dim lbTotal As Double = ldPrimero + ldSegundo + ldTercero
            MessageBox.Show("El total es: " & CStr(lbTotal))
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos

    Friday, January 13, 2012 8:15 AM
  • "Weyler Antonio Uicab Pat" escribió:

    > Tengo las siguientes cantidades:
    >
    > 90.09 + 5.41 + 25.23 = 120.720721 (segun MS Excel 2010)
    >
    > Aplicandole el formato de "Numero" con "2 decimales" se convierte en 120.72

    Hola:

    Si yo sumo 90.09 + 5.41 + 25.23 el resultado es 120.73, no 120.72. ;-)

    Si en Excel obtienes el valor 120.720721 es porque en alguna celda de las que estás sumando su valor contiene más decimales que los que tú has especificado en tu mensaje, o puede suceder que los valores de las celdas ya se encuentren redondeados a 2 decimales. Pero que yo sepa, no se suma el valor redondeado, si no todo el valor existente en las celdas.

    > Ahora bien sumando las mismas cantidades para
    > mostrar el resultado en un textbox obtengo: 120.73

    ¿Y qué valor esperas obtener? Vuelvo a insistir que si sumas 90.09 + 5.41 + 25.23 el resultado es 120.73.

      Dim suma As Double = 90.09R + 5.41R + 25.23R

      suma = Math.Round(suma, 2, MidpointRounding.ToEven)

      TextBox1.Text = CStr(suma)   ' --> 120.73

    > Agradeceria cualquier ayuda o sugerencia para
    > poder solucionar este pequeño inconveniente.

    Salvo que estés utilizando otros números que los indicados para efectuar la suma, no veo yo donde está el inconveniente. :-)

    Un saludo

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    Friday, January 13, 2012 10:09 AM
  • hola

    estas segurio que suma() devuelve el valor 120.720721 ?

    porque realice la siguiente prueba

     Dim valor As Decimal = Convert.ToDecimal("120.720721")
     Dim resultado As String = valor.ToString("N2")

     

    y esto da como resultado 120.72

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    Friday, January 13, 2012 11:43 AM
  • Antes que nada gracias a todos por su tiempo, ayuda y por sus respuestas. Dejo una imagen del problema que planteo al principio:

     

    Y aqui una imagen del formulario de mi aplicacion:

    Como pueden ver la suma deberia dar 120.73 pero excel lo redondea a 120.72 y Visual Basic me arroja 120.73. El detalle es que esas mismas cantidades las obtengo de un ListView y entonces les aplico las mismas operaciones que se muestran en la imagen.

    Saludos y buen dia.


    Friday, January 13, 2012 2:50 PM
  • ¿Ves como en las celdas C3:C5 existen valores con más de dos decimales?

    El resultado no es la suma de 90.09 + 5.41 + 25.23; el que tienes que tomar es el resultado de sumar los valores de las celdas C3:C5, que asciende a 120.7207207.

    Si ese número lo deseas redondear, lo harías de la siguiente manera:

      Dim numero As Decimal = 120.7207207D

      Dim numeroRedondeado As Decimal = Math.Round(numero, 2, MidpointRounding.ToEven)

      MessageBox.Show(numeroRedondeado.ToString())

    Ahora el resultado sí será 120.72. Pero desde luego, no esperes que el resultado de sumar 90.09 + 5.41 + 25.23 sea 120.72 porque no es correcto.

    Insisto que ignoro dónde está el problema. ¿?

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    Friday, January 13, 2012 3:10 PM
  • Ahora que acabas de modificar tu mensaje, observo lo que aparece en el control ListView, y obviamente, el importe TOTAL (la cantidad remarcada en color amarillo) no se corresponde con la suma de las cantidades Sub Total e I.V.A.

    Te tienes que limitar a que en la columna Total aparezcan las cantidades únicamente con dos decimales. El valor de 'Sub Total' será la suma de la columna Total, sin redondeos, porque las cantidades deberán de aparecer con dos decimales.

    La cantidad de I.V.A sí la tienes que redondear a 2 decimales, para que la puedas sumar al valor 'Sub Total' y obtener el TOTAL.

       Dim subTotal As Decimal = 120.73D

       ' IVA = 11%
       Dim iva As Decimal = Math.Round(120.73D * 0.11D, 2, MidpointRounding.ToEven)

       Dim total As Decimal = subTotal + iva

       MessageBox.Show(total.ToString())

    El Total será 134,01, que será la suma de 120.73 + 13.28 del IVA.

     


    Enrique Martínez
      [MS MVP - VB]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    Friday, January 13, 2012 3:24 PM
  • Antes que nada gracias a todos por su tiempo, ayuda y por sus respuestas. Dejo una imagen del problema que planteo al principio:

     

    Y aqui una imagen del formulario de mi aplicacion:

    Como pueden ver la suma deberia dar 120.73 pero excel lo redondea a 120.72 y Visual Basic me arroja 120.73. El detalle es que esas mismas cantidades las obtengo de un ListView y entonces les aplico las mismas operaciones que se muestran en la imagen.

    Saludos y buen dia.


    voy a citar tu mensaje porque el error esta en Excel.

    ¿Porque?

    estoy 100% seguro D3, D4, D5 en excel tu usastes el boton en la barra de herramientas para disminuir los decimales "Decrease decimal"por ende no estar REDONDEANDO y si tu sabes sumar que apuesto a que si, luego de disminuir los decimales que valores tu estas viendo? "90.09, 5.41, 25.23" y que valores tu cerebro te dice que deberia de aparecer en la suma? "120.72" o "120.73"? cuestionate tu mismo.

    ¿Porque?

    porque tu nunca redondeastes las celdas D3, D4 y D5, cierto? o me equivoco?, tu lo que hiciestes fue decirle a excel que en lugar de que te muestre 6 decimales solo te muestre los primeros 2 decimales, aunque el para mostrarte el valor correcto lo redondeo de modo visual, pero nunca cambio los valores de las celdas, Cierto? entonces la suma no se redondeara, dandote como valor 120.72 en lugar de 120.73.

    caso contrario que en lugar de disminuir los decimales hubieras redondeado.

    ejemplo:

    =ROUND(D3,2), que aqui si estas REDONDEANDO por ende la suma deberia ser 120.73.

    asi que para dejarlo claro, el error es visual en Excel, no es que Excel no sepa redondear, es simplemente error visual.

    por ende, lo que mencionan las demas respuestas son correctas.

    espero haberme dado a entender.

    Salu2,


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor

    Friday, January 13, 2012 5:49 PM
  • y agrego aun mas para que quede mas claro, espero!!!!

    90.09009009 si disminuimos los decimales a 2 que te muestra Excel y porque?, te muestra 90.09, porque el siguiente numero al nueve es 0 (cero), cierto? asi que visualmente no redondea a 90.10, si no que lo deja tal cual 90.09

    nomal              | disminuidos los decimales a dos (NO REDONDEADO)

    ---------------------------------------------------------------------------------------------

    90.09009009  | 90.09

    5.405405405  |   5.41 - porque? 5.405 <- termina con 5 y que sucede?

    25.22522523  | 25.23 - porque? 25.225 <- termina con 5 y que sucede?

    ---------------------------------

    120.7207207  | 120.72 <- es correcto este valor SI DISMINUIMOS los decimales?, te marque el 0 en negrillas luego del .72

    ¿ENTONCES?

    donde esta el error?, no hay error, es simplemente error de como se muestra la informacion. no es error de como se calcula la suma porque la suma la hara con todos los decimales.

     

    Salu2,

     

     


    Marvin E. Pineda

      ComboBoxMultiColumns

     NetBarControl

      TextEditor


    Friday, January 13, 2012 6:15 PM
  • Gracias a sus respuestas y sugerencias me pude dar cuenta de mi error. Realmente la suma estaba correcta porque VB no se equivoca (no me cabe la menor duda) pero solamente que yo queria obtener la misma cantidad que excel me mostraba, pero con la diferencia que no tomaba todos los decimales (cosa que excel si tomaba en cuenta), por lo tanto decidi aumentar una columna mas a mi listview la cual me almacena el precio real del producto, y en base a esta cantidad, es sobre la que obtengo el precio sin impuesto, el subtotal y el IVA, y por lo visto me ha funcionado correctamente.

    De nuevo gracias a todos.


    De antemano agradezco el tiempo que te tomas por ayudarme. Muchas gracias.
    Friday, January 13, 2012 6:50 PM