Skip to content

Commit 3e1eede

Browse files
committed
fix(normalize): remove decimal point normalization
1 parent e2714a6 commit 3e1eede

File tree

4 files changed

+15
-23
lines changed

4 files changed

+15
-23
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ You can use basic operations (e.g. +, -, \*, /, %, ^ etc.) in you expressions.
2222
- 175 + 175 \* 18% + 40 = 246.5
2323
- 10 + (100 - 100 \* 18%) \* 5 + 40 / 20 = 422
2424

25+
> _NOTE_: Floating points must be handled carefully. Use `Number(<number>).toFixed(<digits>)` to fix the digits after
26+
> decimal point.
27+
2528
## Api
2629

2730
### evalExpr

src/index.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ describe("Evaluate Numerical Expressions", () => {
1717
it("Grouping via parenthesis", () => {
1818
expect(evalNumExpr("1 +(1 +2) * 4/2")).toBe(7);
1919
expect(evalNumExpr("3 * ((4 + 2) / 2)")).toEqual(9);
20-
expect(evalNumExpr("3 + 4 x 2 / ( 1 - 5 ) ^ 2 ^ 3")).toEqual(3);
20+
expect(evalNumExpr("3 + 128 x 2 / ( 1 - 3 ) ^ 2 ^ 2")).toEqual(19);
2121
});
2222

2323
it("Throws expressions for invalid inputs", () => {

src/index.ts

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
/**
22
* https://en.wikipedia.org/wiki/Shunting-yard_algorithm
33
*/
4-
export default function evalNumExpr(
5-
amount: string,
6-
digitsAfterDecimal: number = 2
7-
): number {
4+
export default function evalNumExpr(amount: string): number {
85
// operators with Precedence and Associativity
96
const operators = [
107
new Operator("-", 2),
@@ -90,22 +87,9 @@ export default function evalNumExpr(
9087
// stack has more than one number and we are out of operators
9188
throw new Error("Missing operators.");
9289
}
93-
return normalizeNumber(values.pop(), digitsAfterDecimal);
90+
return values.pop();
9491
}
9592

96-
function normalizeNumber(
97-
n: number,
98-
digitsAfterDecimal: number | undefined = 2
99-
): number {
100-
let str = n.toString();
101-
if (digitsAfterDecimal !== undefined) {
102-
str = Number(str).toFixed(digitsAfterDecimal).toString();
103-
}
104-
if (parseInt(str) === parseFloat(str)) {
105-
str = parseInt(str).toString();
106-
}
107-
return Number(str);
108-
}
10993
type OperatorFns = "-" | "+" | "/" | "*" | "^";
11094

11195
class Operator {

types/index.d.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
export default function evalNumExpr(
2-
expression: string,
3-
digitsAfterDecimal?: number
4-
): number;
1+
/**
2+
* Evaluate numeric mathematical expression
3+
* @param string expression - The expression to evaluate ("24 + 65 * 3 - 48")
4+
* @return number - The evaluated value.
5+
*
6+
* NOTE: When passing floating points, please handle the digits after decimal point
7+
* e.g. 2 - 1.1 leads to 0.8999999999999999 intead of .9
8+
*/
9+
export default function evalNumExpr(expression: string): number;

0 commit comments

Comments
 (0)