aboutsummaryrefslogtreecommitdiff
path: root/src/amounts.ts
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2018-07-05 02:09:07 +0200
committerFlorian Dold <florian.dold@gmail.com>2018-07-05 02:09:07 +0200
commit075fe28f74c9545a2d2d144a02abb134430d1352 (patch)
treebd14f82260806d4603adf26121685b376699fdd7 /src/amounts.ts
parenta4edc3b17f27de5866e11d04a1fc9bbd4d657867 (diff)
downloadwallet-core-075fe28f74c9545a2d2d144a02abb134430d1352.tar.xz
avoid floating point imprecision with amounts
Diffstat (limited to 'src/amounts.ts')
-rw-r--r--src/amounts.ts23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/amounts.ts b/src/amounts.ts
index 1aefe07e1..1ab00f81d 100644
--- a/src/amounts.ts
+++ b/src/amounts.ts
@@ -31,6 +31,13 @@ import { Checkable } from "./checkable";
*/
export const fractionalBase = 1e8;
+/**
+ * How many digits behind the comma are required to represent the
+ * fractional value in human readable decimal format? Must match
+ * lg(fractionalBase)
+ */
+export const fractionalLength = 8;
+
/**
* Non-negative financial amount. Fractional values are expressed as multiples
@@ -282,7 +289,21 @@ export function fromFloat(floatVal: number, currency: string) {
* also used in JSON formats.
*/
export function toString(a: AmountJson) {
- return `${a.currency}:${a.value + (a.fraction / fractionalBase)}`;
+ let s = a.value.toString()
+
+ if (a.fraction) {
+ s = s + ".";
+ let n = a.fraction;
+ for (let i = 0; i < fractionalLength; i++) {
+ if (!n) {
+ break;
+ }
+ s = s + Math.floor(n / fractionalBase * 10).toString();
+ n = (n * 10) % fractionalBase;
+ }
+ }
+
+ return `${a.currency}:${s}`;
}