Ejemplo
github.com/shopspring/decimal 1.4.0: Hold money in shopspring/decimal without losing cents to Div, ==, or String()
Muestra verificada para golang github.com/shopspring/decimal 1.4.0: Hold money in shopspring/decimal without losing cents to Div, ==, or String(). El…
sha256:84206d243236399467879a1efbd7f91542f9c90b1d044a06e8611694204998bd
Esta red ofrece una sola cosa: una muestra que compila. La ejecutó en un sandbox y guardó el recibo firmado. No califica ni garantiza nada: si el mismo código compila donde estás no es algo que haya medido.
Cuántas claves de firma distintas presentaron un recibo de contrato aprobado. Una es solo el autor; más de una significa que alguien más también lo compiló. Una clave se genera sola y no tiene identidad registrada detrás, así que cuenta claves, no personas.
MIT-0
Evidencia de ejecución
El entorno declarado y las ejecuciones firmadas se muestran por separado, para que veas exactamente qué ejecutó esta muestra y dónde.
- Base de evidencia
- Contrato firmado aprobado
- Recibos de verificación
- 2
- Claves de firma que lo compilaron
- 2
Entorno declarado
go 1.26 linux x64 go 1.26 go go
Entornos de las ejecuciones de verificación
| Entorno | Contrato | Etapas | Ejecución |
|---|---|---|---|
| go 1.26 · linux alpine/x64 · docker ed25519:a2ec939a4c60e243 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · golang@1 |
2026-08-14 |
| go 1.26 · linux alpine/x64 · docker ed25519:2175b912ea1c23b1 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · golang@1 |
2026-08-18 |
Caso
HOW- Objetivo
- Hold money in shopspring/decimal without losing cents to Div, ==, or String()
- Paquetes
- Símbolos
-
- decimal.NewFromString
- decimal.NewFromFloat
- decimal.DivisionPrecision
- Decimal.Equal
- Decimal.QuoRem
- Decimal.RoundBank
- Decimal.StringFixed
- Entorno
- go 1.26
- Creado
- 2026-08-14T08:53:07Z
Contrato
- assert NewFromFloat(0.1).String() is "0.1" and Equal to NewFromString("0.1"), so the constructor is not where 0.1 goes wrong
- assert the loss happens in float64 before the constructor, including digits float64 cannot hold at all
- assert Go folds untyped constant 0.1+0.2 exactly, so the demo only misbehaves once the operands are variables
- assert Add and Mul are exact where the float64 equivalents give 7.000000000000001 and 3.3000000000000003
- assert Mul adds the exponents of its operands while Add and Sub keep the finer of the two, and the Sum identity decimal.Zero is New(0,1) rather than New(0,0)
- assert DivisionPrecision defaults to 16 and is a mutable global, so (1/3)*3 is 0.9999999999999999 and not 1
- assert Div rounds rather than truncates, so 2/3 ends in a 7, and DivRound takes the precision as an argument
- assert QuoRem returns the exact remainder and splitting 10.00 three ways adds back up to 10.00, while a total finer than the split scale pays out a cent more
- assert Equal compares values while == compares the *big.Int pointer and the scale, so two parses of "1.0" are not ==
- assert the zero value is a usable 0 that is Equal to decimal.Zero but not == to New(0,0)
- assert Cmp orders numerically and drops into slices.SortFunc as a method expression
- assert Round is half away from zero and RoundBank is half to even, that they agree wherever the digit ahead of the half is odd, and that the disagreement moves a four-line invoice total by two cents
- assert rounding cents through float64 obeys neither rule, because 1.005 falls below the half and 8.045 lands exactly on it
- assert String() trims trailing zeros while the exponent stays -2, and StringFixed / StringFixedBank are the money formats
- assert NewFromString rejects "1,005" instead of guessing a number
Archivos
- csx.json
- go.mod
- go.sum
- src/money.go
- test/main.go