From f624bf36d1cea3d55616b46be1da6ce8abe9328f Mon Sep 17 00:00:00 2001 From: Patrick Buchner Date: Tue, 7 Mar 2023 09:26:11 +0100 Subject: [PATCH] add blog post about accuracy of decimal computations --- foomo/.gitignore | 1 + .../floating_point_representation.webp | Bin 0 -> 18754 bytes .../index.mdx | 77 ++++++++++++++++++ foomo/blog/authors.yml | 5 ++ 4 files changed, 83 insertions(+) create mode 100644 foomo/blog/2023-03-06-accuracy-of-decimal-computations/floating_point_representation.webp create mode 100644 foomo/blog/2023-03-06-accuracy-of-decimal-computations/index.mdx diff --git a/foomo/.gitignore b/foomo/.gitignore index c9f8dc3..0e76c13 100644 --- a/foomo/.gitignore +++ b/foomo/.gitignore @@ -19,3 +19,4 @@ npm-debug.log* yarn-debug.log* yarn-error.log* +pnpm-lock.yaml diff --git a/foomo/blog/2023-03-06-accuracy-of-decimal-computations/floating_point_representation.webp b/foomo/blog/2023-03-06-accuracy-of-decimal-computations/floating_point_representation.webp new file mode 100644 index 0000000000000000000000000000000000000000..a74faa8c820b0344d4eeecbdf08dcf4247be5705 GIT binary patch literal 18754 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 OCl{rr<`rk;mjD2N<3w%% literal 0 HcmV?d00001 diff --git a/foomo/blog/2023-03-06-accuracy-of-decimal-computations/index.mdx b/foomo/blog/2023-03-06-accuracy-of-decimal-computations/index.mdx new file mode 100644 index 0000000..5da7d0c --- /dev/null +++ b/foomo/blog/2023-03-06-accuracy-of-decimal-computations/index.mdx @@ -0,0 +1,77 @@ +--- +slug: accuracy-of-decimal-computations +authors: [patrickb] +tags: [golang, currency, decimal accuracy] +--- + +# Accuracy of decimal computations + +## Intro + +Calculating with money can be tricky if not taken proper precautions. Some might be tempted to use float representation for calculating with currency values. That is problematic because of possible rounding errors. + +## Finite accuracy of representation + +Floating points are represented like this + +![Floating point representation](floating_point_representation.webp) + +Not every number can be represented with a finite number of decimal places + +0.01 —> 0.0000011001100110011… + +Taking 17 places of the above results in 0.010000000000000001 + +Consider the following code snipet that shows the missing accuracy + +```go +func main() { + + var n float64 = 0 + + for i := 0; i < 1000; i++ { + n += .01 + } + + fmt.Println(n) + +} +``` + +Result: 9.999999999999831 + +## Money computations + +They can't be done with floating-point as it would inevitably lead to rounding errors. + +Even the following packages are problematic: + +[github.com/shopspring/decimal](https://github.com/shopspring/decimal) + +[github.com/Rhymond/go-money](https://github.com/Rhymond/go-money) + +```go +a := decimal.NewFromInt(2) +b := decimal.NewFromFloat(300.99) +c := a.Mul(b) +d := c.Div(decimal.NewFromInt(3)) +``` + +## Solution + +Use Int by representing money in cents: + +- 10.99 -> 1099 (cents) +- 10.9900 -> 109900 (4 digit tax) + +## Conclusio + +Division is a problem! + +1/3 - > 0.33333333… +Correct way: 0.33, 0.33, 0.34 + +When doing money calculations one should avoid division as it inevitably leads to loss of accuracy. +When dividing make sure to round to cent and deal with diffs. + +Division by 10^k is ok till we are inside of the range of the data type. diff --git a/foomo/blog/authors.yml b/foomo/blog/authors.yml index 37f8149..81b9c66 100644 --- a/foomo/blog/authors.yml +++ b/foomo/blog/authors.yml @@ -23,3 +23,8 @@ nicola: title: Memelord brother url: https://github.com/nicolaturcato image_url: https://github.com/nicolaturcato.png +patrickb: + name: Patrick Buchner + title: MSc + url: https://github.com/smartinov + image_url: https://github.com/uebriges.png