Contamos con tu ayuda para difundir nuestros tutoriales con relación a las ciencias de la computación.
Solución:
Yo diría que una forma de hacerlo es almacenar cantidades de dinero utilizando un tipo de número entero del tamaño adecuado, normalizado a la cantidad más baja posible. Digamos, si necesita almacenar montos en dólares estadounidenses hasta un centavo, multiplique sus valores por 100 y, por lo tanto, guárdelos en centavos completos.
Otra forma es implementar un tipo personalizado que modele lo que es “decimal” en otros idiomas, es decir, usaría dos números enteros para representar la cantidad de dinero.
En realidad, hay algunos paquetes que implementan un tipo decimal, aunque no hay un líder claro entre ellos.
Esto parece una gran oportunidad para crear un tipo, que almacena el valor de una manera segura y precisa basada en enteros, pero le brinda el comportamiento adicional que desearía de un tipo decimal. Por ejemplo, una implementación rápida podría verse así (https://play.golang.org/p/nYbLiadQOc):
// USD represents US dollar amount in terms of cents
type USD int64
// ToUSD converts a float64 to USD
// e.g. 1.23 to $1.23, 1.345 to $1.35
func ToUSD(f float64) USD
return USD((f * 100) + 0.5)
// Float64 converts a USD to float64
func (m USD) Float64() float64
x := float64(m)
x = x / 100
return x
// Multiply safely multiplies a USD value by a float64, rounding
// to the nearest cent.
func (m USD) Multiply(f float64) USD
x := (float64(m) * f) + 0.5
return USD(x)
// String returns a formatted USD value
func (m USD) String() string
x := float64(m)
x = x / 100
return fmt.Sprintf("$%.2f", x)
El tipo dado se comporta de la manera que cabría esperar, especialmente en casos de uso complicados.
fmt.Println("Product costs $9.09. Tax is 9.75%.")
f := 9.09
t := 0.0975
ft := f * t
fmt.Printf("Floats: %.18f * %.18f = %.18fn", f, t, ft)
u := ToUSD(9.09)
ut := u.Multiply(t)
fmt.Printf("USD: %v * %v = %vn", u, t, ut)
El producto cuesta $9.09. El impuesto es del 9,75%.
Flotadores: 9.089999999999999858 * 0.097500000000000003 = 0.886275000000000035
USD: $9,09 * 0,0975 = $0,89