diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fea6ffe6d74..0249a1d31d4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,7 @@ if input key is empty, or input data contains empty key. * [#9088](https://github.com/cosmos/cosmos-sdk/pull/9088) Added implementation to ADR-28 Derived Addresses. * [\#9133](https://github.com/cosmos/cosmos-sdk/pull/9133) Added hooks for governance actions. * (x/staking) [\#9214](https://github.com/cosmos/cosmos-sdk/pull/9214) Added `new_shares` attribute inside `EventTypeDelegate` event. +* [\#9382](https://github.com/cosmos/cosmos-sdk/pull/9382) feat: add Dec.Float64() function. ### Client Breaking Changes diff --git a/types/decimal.go b/types/decimal.go index 365b8c8c918c..47de0618bc83 100644 --- a/types/decimal.go +++ b/types/decimal.go @@ -474,6 +474,22 @@ func (d Dec) String() string { return string(bzStr) } +// Float64 returns the float64 representation of a Dec. +// Will return the error if the conversion failed. +func (d Dec) Float64() (float64, error) { + return strconv.ParseFloat(d.String(), 64) +} + +// MustFloat64 returns the float64 representation of a Dec. +// Would panic if the conversion failed. +func (d Dec) MustFloat64() float64 { + if value, err := strconv.ParseFloat(d.String(), 64); err != nil { + panic(err) + } else { + return value + } +} + // ____ // __| |__ "chop 'em // ` \ round!" diff --git a/types/decimal_test.go b/types/decimal_test.go index efa0ce2023d0..16a1561cb3ee 100644 --- a/types/decimal_test.go +++ b/types/decimal_test.go @@ -100,6 +100,28 @@ func (s *decimalTestSuite) TestDecString() { } } +func (s *decimalTestSuite) TestDecFloat64() { + tests := []struct { + d sdk.Dec + want float64 + }{ + {sdk.NewDec(0), 0.000000000000000000}, + {sdk.NewDec(1), 1.000000000000000000}, + {sdk.NewDec(10), 10.000000000000000000}, + {sdk.NewDec(12340), 12340.000000000000000000}, + {sdk.NewDecWithPrec(12340, 4), 1.234000000000000000}, + {sdk.NewDecWithPrec(12340, 5), 0.123400000000000000}, + {sdk.NewDecWithPrec(12340, 8), 0.000123400000000000}, + {sdk.NewDecWithPrec(1009009009009009009, 17), 10.090090090090090090}, + } + for tcIndex, tc := range tests { + value, err := tc.d.Float64() + s.Require().Nil(err, "error getting Float64(), index: %v", tcIndex) + s.Require().Equal(tc.want, value, "bad Float64(), index: %v", tcIndex) + s.Require().Equal(tc.want, tc.d.MustFloat64(), "bad MustFloat64(), index: %v", tcIndex) + } +} + func (s *decimalTestSuite) TestEqualities() { tests := []struct { d1, d2 sdk.Dec