@cosmjs/math
Advanced tools
Comparing version 0.26.6 to 0.26.8
@@ -10,2 +10,16 @@ import { Uint32, Uint53, Uint64 } from "./integers"; | ||
static fromAtomics(atomics: string, fractionalDigits: number): Decimal; | ||
/** | ||
* Creates a Decimal with value 0.0 and the given number of fractial digits. | ||
* | ||
* Fractional digits are not relevant for the value but needed to be able | ||
* to perform arithmetic operations with other decimals. | ||
*/ | ||
static zero(fractionalDigits: number): Decimal; | ||
/** | ||
* Creates a Decimal with value 1.0 and the given number of fractial digits. | ||
* | ||
* Fractional digits are not relevant for the value but needed to be able | ||
* to perform arithmetic operations with other decimals. | ||
*/ | ||
static one(fractionalDigits: number): Decimal; | ||
private static verifyFractionalDigits; | ||
@@ -17,2 +31,8 @@ static compare(a: Decimal, b: Decimal): number; | ||
private constructor(); | ||
/** Creates a new instance with the same value */ | ||
private clone; | ||
/** Returns the greatest decimal <= this which has no fractional part (rounding down) */ | ||
floor(): Decimal; | ||
/** Returns the smallest decimal >= this which has no fractional part (rounding up) */ | ||
ceil(): Decimal; | ||
toString(): string; | ||
@@ -19,0 +39,0 @@ /** |
@@ -63,2 +63,22 @@ "use strict"; | ||
} | ||
/** | ||
* Creates a Decimal with value 0.0 and the given number of fractial digits. | ||
* | ||
* Fractional digits are not relevant for the value but needed to be able | ||
* to perform arithmetic operations with other decimals. | ||
*/ | ||
static zero(fractionalDigits) { | ||
Decimal.verifyFractionalDigits(fractionalDigits); | ||
return new Decimal("0", fractionalDigits); | ||
} | ||
/** | ||
* Creates a Decimal with value 1.0 and the given number of fractial digits. | ||
* | ||
* Fractional digits are not relevant for the value but needed to be able | ||
* to perform arithmetic operations with other decimals. | ||
*/ | ||
static one(fractionalDigits) { | ||
Decimal.verifyFractionalDigits(fractionalDigits); | ||
return new Decimal("1" + "0".repeat(fractionalDigits), fractionalDigits); | ||
} | ||
static verifyFractionalDigits(fractionalDigits) { | ||
@@ -84,2 +104,30 @@ if (!Number.isInteger(fractionalDigits)) | ||
} | ||
/** Creates a new instance with the same value */ | ||
clone() { | ||
return new Decimal(this.atomics, this.fractionalDigits); | ||
} | ||
/** Returns the greatest decimal <= this which has no fractional part (rounding down) */ | ||
floor() { | ||
const factor = new bn_js_1.default(10).pow(new bn_js_1.default(this.data.fractionalDigits)); | ||
const whole = this.data.atomics.div(factor); | ||
const fractional = this.data.atomics.mod(factor); | ||
if (fractional.isZero()) { | ||
return this.clone(); | ||
} | ||
else { | ||
return Decimal.fromAtomics(whole.mul(factor).toString(), this.fractionalDigits); | ||
} | ||
} | ||
/** Returns the smallest decimal >= this which has no fractional part (rounding up) */ | ||
ceil() { | ||
const factor = new bn_js_1.default(10).pow(new bn_js_1.default(this.data.fractionalDigits)); | ||
const whole = this.data.atomics.div(factor); | ||
const fractional = this.data.atomics.mod(factor); | ||
if (fractional.isZero()) { | ||
return this.clone(); | ||
} | ||
else { | ||
return Decimal.fromAtomics(whole.addn(1).mul(factor).toString(), this.fractionalDigits); | ||
} | ||
} | ||
toString() { | ||
@@ -86,0 +134,0 @@ const factor = new bn_js_1.default(10).pow(new bn_js_1.default(this.data.fractionalDigits)); |
@@ -105,2 +105,70 @@ "use strict"; | ||
}); | ||
describe("zero", () => { | ||
it("works", () => { | ||
expect(decimal_1.Decimal.zero(0).toString()).toEqual("0"); | ||
expect(decimal_1.Decimal.zero(1).toString()).toEqual("0"); | ||
expect(decimal_1.Decimal.zero(2).toString()).toEqual("0"); | ||
expect(decimal_1.Decimal.zero(30).toString()).toEqual("0"); | ||
expect(decimal_1.Decimal.zero(0).fractionalDigits).toEqual(0); | ||
expect(decimal_1.Decimal.zero(1).fractionalDigits).toEqual(1); | ||
expect(decimal_1.Decimal.zero(2).fractionalDigits).toEqual(2); | ||
expect(decimal_1.Decimal.zero(30).fractionalDigits).toEqual(30); | ||
expect(decimal_1.Decimal.zero(0).atomics).toEqual("0"); | ||
expect(decimal_1.Decimal.zero(1).atomics).toEqual("0"); | ||
expect(decimal_1.Decimal.zero(2).atomics).toEqual("0"); | ||
expect(decimal_1.Decimal.zero(30).atomics).toEqual("0"); | ||
expect(() => decimal_1.Decimal.zero(NaN)).toThrowError(/Fractional digits is not an integer/i); | ||
expect(() => decimal_1.Decimal.zero(1.2)).toThrowError(/Fractional digits is not an integer/i); | ||
}); | ||
}); | ||
describe("one", () => { | ||
it("works", () => { | ||
expect(decimal_1.Decimal.one(0).toString()).toEqual("1"); | ||
expect(decimal_1.Decimal.one(1).toString()).toEqual("1"); | ||
expect(decimal_1.Decimal.one(2).toString()).toEqual("1"); | ||
expect(decimal_1.Decimal.one(30).toString()).toEqual("1"); | ||
expect(decimal_1.Decimal.one(0).fractionalDigits).toEqual(0); | ||
expect(decimal_1.Decimal.one(1).fractionalDigits).toEqual(1); | ||
expect(decimal_1.Decimal.one(2).fractionalDigits).toEqual(2); | ||
expect(decimal_1.Decimal.one(30).fractionalDigits).toEqual(30); | ||
expect(decimal_1.Decimal.one(0).atomics).toEqual("1"); | ||
expect(decimal_1.Decimal.one(1).atomics).toEqual("10"); | ||
expect(decimal_1.Decimal.one(2).atomics).toEqual("100"); | ||
expect(decimal_1.Decimal.one(30).atomics).toEqual("1000000000000000000000000000000"); | ||
expect(() => decimal_1.Decimal.one(NaN)).toThrowError(/Fractional digits is not an integer/i); | ||
expect(() => decimal_1.Decimal.one(1.2)).toThrowError(/Fractional digits is not an integer/i); | ||
}); | ||
}); | ||
describe("floor", () => { | ||
it("works", () => { | ||
// whole numbers | ||
expect(decimal_1.Decimal.fromUserInput("0", 0).floor().toString()).toEqual("0"); | ||
expect(decimal_1.Decimal.fromUserInput("1", 0).floor().toString()).toEqual("1"); | ||
expect(decimal_1.Decimal.fromUserInput("44", 0).floor().toString()).toEqual("44"); | ||
expect(decimal_1.Decimal.fromUserInput("0", 3).floor().toString()).toEqual("0"); | ||
expect(decimal_1.Decimal.fromUserInput("1", 3).floor().toString()).toEqual("1"); | ||
expect(decimal_1.Decimal.fromUserInput("44", 3).floor().toString()).toEqual("44"); | ||
// with fractional part | ||
expect(decimal_1.Decimal.fromUserInput("0.001", 3).floor().toString()).toEqual("0"); | ||
expect(decimal_1.Decimal.fromUserInput("1.999", 3).floor().toString()).toEqual("1"); | ||
expect(decimal_1.Decimal.fromUserInput("0.000000000000000001", 18).floor().toString()).toEqual("0"); | ||
expect(decimal_1.Decimal.fromUserInput("1.999999999999999999", 18).floor().toString()).toEqual("1"); | ||
}); | ||
}); | ||
describe("ceil", () => { | ||
it("works", () => { | ||
// whole numbers | ||
expect(decimal_1.Decimal.fromUserInput("0", 0).ceil().toString()).toEqual("0"); | ||
expect(decimal_1.Decimal.fromUserInput("1", 0).ceil().toString()).toEqual("1"); | ||
expect(decimal_1.Decimal.fromUserInput("44", 0).ceil().toString()).toEqual("44"); | ||
expect(decimal_1.Decimal.fromUserInput("0", 3).ceil().toString()).toEqual("0"); | ||
expect(decimal_1.Decimal.fromUserInput("1", 3).ceil().toString()).toEqual("1"); | ||
expect(decimal_1.Decimal.fromUserInput("44", 3).ceil().toString()).toEqual("44"); | ||
// with fractional part | ||
expect(decimal_1.Decimal.fromUserInput("0.001", 3).ceil().toString()).toEqual("1"); | ||
expect(decimal_1.Decimal.fromUserInput("1.999", 3).ceil().toString()).toEqual("2"); | ||
expect(decimal_1.Decimal.fromUserInput("0.000000000000000001", 18).ceil().toString()).toEqual("1"); | ||
expect(decimal_1.Decimal.fromUserInput("1.999999999999999999", 18).ceil().toString()).toEqual("2"); | ||
}); | ||
}); | ||
describe("toString", () => { | ||
@@ -107,0 +175,0 @@ it("displays no decimal point for full numbers", () => { |
{ | ||
"name": "@cosmjs/math", | ||
"version": "0.26.6", | ||
"version": "0.26.8", | ||
"description": "Math helpers for blockchain projects", | ||
@@ -31,3 +31,3 @@ "contributors": [ | ||
"format-text": "prettier --write \"./*.md\"", | ||
"test-node": "node --require esm jasmine-testrunner.js", | ||
"test-node": "yarn node jasmine-testrunner.js", | ||
"test-edge": "yarn pack-web && karma start --single-run --browsers Edge", | ||
@@ -44,7 +44,7 @@ "test-firefox": "yarn pack-web && karma start --single-run --browsers Firefox", | ||
"dependencies": { | ||
"bn.js": "^4.11.8" | ||
"bn.js": "^5.2.0" | ||
}, | ||
"devDependencies": { | ||
"@istanbuljs/nyc-config-typescript": "^1.0.1", | ||
"@types/bn.js": "^4.11.6", | ||
"@types/bn.js": "^5", | ||
"@types/eslint-plugin-prettier": "^3", | ||
@@ -55,4 +55,4 @@ "@types/jasmine": "^3.8", | ||
"@types/karma-jasmine-html-reporter": "^1", | ||
"@typescript-eslint/eslint-plugin": "^4.28", | ||
"@typescript-eslint/parser": "^4.28", | ||
"@typescript-eslint/eslint-plugin": "^5.13.0", | ||
"@typescript-eslint/parser": "^5.13.0", | ||
"buffer": "^6.0.3", | ||
@@ -67,6 +67,5 @@ "eslint": "^7.5", | ||
"glob": "^7.1.6", | ||
"jasmine": "^3.8", | ||
"jasmine-core": "^3.7.1", | ||
"jasmine": "^3.99", | ||
"jasmine-spec-reporter": "^6", | ||
"karma": "^6.1.1", | ||
"karma": "^6.3.14", | ||
"karma-chrome-launcher": "^3.1.0", | ||
@@ -81,4 +80,4 @@ "karma-firefox-launcher": "^2.1.0", | ||
"ts-node": "^8", | ||
"typedoc": "^0.21", | ||
"typescript": "~4.3", | ||
"typedoc": "^0.22", | ||
"typescript": "~4.4", | ||
"webpack": "^5.32.0", | ||
@@ -85,0 +84,0 @@ "webpack-cli": "^4.6.0" |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
182017
34
1480
+ Addedbn.js@5.2.1(transitive)
- Removedbn.js@4.12.0(transitive)
Updatedbn.js@^5.2.0