Saltar al contenido

¿Cómo representar la moneda en Go?

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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *