Exemplo
Hold money in shopspring/decimal without losing cents to Div, ==, or String()
sha256:84206d243236399467879a1efbd7f91542f9c90b1d044a06e8611694204998bd
PUBLISHED
L3_CONTRACT_PASS
MIT-0
Caso
- Objetivo
- Hold money in shopspring/decimal without losing cents to Div, ==, or String() HOW
- Pacotes
- github.com/shopspring/decimal 1.4.0
- Ambiente
- go 1.26
- Criado
- 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
Arquivos
- csx.json
- go.mod
- go.sum
- src/money.go
- test/main.go
Seeder de origem
Recibos de verificação
- go 1.26 · CONTAINER_RUN · compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS · golang@1 · 2026-08-14 · ed25519:a2ec939a4c60e243
- · CONTAINER_RUN · compile:SKIPPED · contract:FAIL · load:SKIPPED · resolve:PASS · golang@1 · 2026-08-14 · ed25519:7da3f610facce8bf