2012-06-18 10 views
5

Actualmente estoy aprendiendo C++ y esto se me acaba de ocurrir. Solo tengo curiosidad acerca de esto porque estoy a punto de desarrollar un programa bancario simple. Utilizaré double para calcular dólares/tasa de interés, etc., pero existen algunas pequeñas diferencias entre los cálculos de la computadora y los cálculos humanos.Si flotante y doble no son precisos, ¿cómo hacen los bancos cálculos precisos que involucran dinero?

¡Me imagino que esos centavos adicionales en el mundo real pueden marcar la diferencia!

+3

check http://stackoverflow.com/questions/149033/best-way-to-store-currency-values-in-c –

+0

¡Muchas gracias por su información! –

+0

Vea también http://introcs.cs.princeton.edu/java/91float/, que describe este problema en detalle para los estudiantes de CS. – jvriesem

Respuesta

12

En muchos casos, los cálculos financieros se realizan usando aritmética de coma fija en lugar de coma flotante.

Por ejemplo, el tipo .NET Decimal, o el tipo VB6 Currency. Básicamente son solo tipos enteros, donde todos han acordado que las unidades son una fracción de un centavo, como $ .0001.

Y sí, debe producirse un redondeo, pero se realiza de forma muy sistemática. Por lo general, las reglas de redondeo están en algún lugar de la letra pequeña de su contrato (la tasa de interés es x%, compuesta cada T, redondeada al centavo más cercano, pero no menos de $ y cada período de estado de cuenta).

+0

Estoy de acuerdo, los cálculos muy precisos para las coordenadas del juego a menudo se hacen con cálculos enteros también. Los cálculos de puntos flotantes siempre tienen algún nivel de errores de redondeo. –

+0

No lo pensé de esa manera, ¡salud! Estoy echando un vistazo a la aritmética de punto fijo. Otra idea que se ha planteado es si los bancos utilizan el redondeo a su favor y si genera una cantidad masiva de beneficios (dado el gran número de transacciones que ocurren todo el tiempo). –

+2

@Kurzon: las transacciones "ordinarias" no tienen ningún error de redondeo, ya que cuando transfiero '$ 1.23' a usted, mi saldo baja exactamente por' 123c' y el suyo sube exactamente por '123c': el punto fijo tarda preocuperase por ello. Se aplica a cosas como intereses y comisiones, donde multiplicas una cantidad de dinero por un porcentaje que puede tener muchos decimales. Pero, como dice Ben, las reglas están definidas por un contrato o ley en alguna parte. Si usted es un operador de arbitraje de alta velocidad, tal vez le importa redondear las reglas. Otros clientes probablemente no tanto. –

0

El hecho de que un número no sea un número entero no significa que no se pueda calcular exactamente. Considere que un valor de dólares y centavos es un número entero si uno cuenta la cantidad de centavos (centavos), por lo que es una cuestión simple para una biblioteca de punto fijo usar dos decimales de precisión para simplemente multiplicar cada número por 100, realizar el cálculo como un entero, y luego divida entre 100 nuevamente.

1

El rango de 8 bytes de largo es: -9223372036854775808 máximo: 9223372036854775807 haga todo como miles de centavos/centavo y aún puede manejar números hasta los billones de dólares/libras/lo que sea.

1

Depende de la aplicación. Todos los cálculos con decimales requieren redondeo cuando los muestres como dólares y centavos (o lo que sea ): el precio base de un artículo solo puede tener dos dígitos después del decimal, pero cuando agregas el impuesto a las ventas o IVA, no será más, y si necesita calcular el interés de una inversión, habrá más.

En general, el uso de double resultados en los resultados más precisos, sin embargo ... si su software está siendo utilizado por algún tipo de contabilidad requerido por la ley (por ejemplo, para fines fiscales), que pueden ser necesarios para seguir norma las prácticas de redondeo aceptadas, y estas se basan en decimal aritmético, no binario, hexadecimal u octal (que son las bases habituales para el punto flotante — binario es universal en todo excepto en los mainframes ). En tales casos, deberá utilizar algún tipo de clase Decimal , lo que garantiza el redondeo correcto. Para otros usos (por ejemplo, análisis de riesgo ), double está bien.

Cuestiones relacionadas