@yaeda/calculator
v0.0.0
Published
a calculator
Downloads
69
Readme
@yaeda/calculator
A simple JavaScript library for evaluating mathematical expressions.
Features
- Supports basic arithmetic operations (
+
,-
,*
,/
) - Supports parentheses (
(
,)
), exponentiation (^
), and square root (sqrt
) - Supports 見せ算 (
@
)- same precedence as multiplication and division, and left-associative
- Allows omission of multiplication sign between number and parentheses
- Allows changing the number of decimal places with an option
Installation
You can install the library via npm:
npm install @yaeda/calculator
Usage
First, import the calc
function from the library:
import { calc } from "@yaeda/calculator";
Example
Here are some examples of how to use the calc
function:
import { calc } from "@yaeda/calculator";
calc("0.1 + 0.2"); // 0.3
calc("1 * 2 + 3 / 4 - 5"); // -2.25
calc("2 * 2 ^ 2"); // 8
calc("2(3+4)"); // 14
// round to specified decimal places
calc("3.14159265359", { digits: 2 }); // 3.14
calc("1 / 3", { digits: 3 }); // 0.333
// invalid expression
calc("invalid expression"); // null
For more examples, please refer to the test directory.
API
calc
/**
* Evaluates a mathematical expression and returns the result rounded to a specified number of decimal places.
*
* @param {string} expr - The mathematical expression to evaluate.
* @param {Option} [option] - Optional settings.
* @param {number} [option.digits=10] - The number of decimal places to round the result to. Defaults to 10 if not provided.
* @returns {number|null} The evaluated result rounded to the specified number of decimal places, or null if an error occurs.
*/
export const calc: (expr: string, option?: Option) => number | null;
Option
/**
* @typedef {Object} Option
* @property {number} digits - The number of decimal places to round the result to.
*/
export type Option = {
digits: number;
};
Expression Syntax
The syntax for the mathematical expressions is defined using Extended Backus-Naur Form (EBNF):
<expression> ::= <term> | <expression> ("+" | "-") <term>
<term> ::= <factor> | <term> ("*" | "/" | "@") <factor>
<factor> ::= <base> | <base> "^" <factor>
<base> ::= <number> | ("+" | "-" | "sqrt") <base> | "(" <expression> ")" | <number> "(" <expression> ")"
<number> ::= \d+(\.\d+)?
References
This library is based on and inspired by the following projects: