An arbitrary-precision Decimal type for JavaScript.Decimal.js——JavaScript的任意精度Decimal类型。github
Number.prototype
and Math
objectsNumber.prototype
和Math
对象的许多方法The library is similar to bignumber.js, but here precision is specified in terms of significant digits rather than decimal places, and all calculations are rounded to the precision (similar to Python's decimal module) rather than just those involving division.该库类似于bignumber.js,但这里的精度是以有效数字而不是小数位数来指定的,所有计算都四舍五入到精度(类似于Python的十进制模块),而不仅仅是涉及除法的计算。
This library also adds the trigonometric functions, among others, and supports non-integer powers, which makes it a significantly larger library than bignumber.js and the even smaller big.js.这个库还添加了三角函数等,并支持非整数幂,这使得它比bignumber.js和更小的big.js更大。
For a lighter version of this library without the trigonometric functions see decimal.js-light.对于没有三角函数的这个库的更轻版本,请参阅decimal.js-light。
The library is the single JavaScript file decimal.js or ES module decimal.mjs.该库是单个JavaScript文件decimal.js或ES模块decimal.mjs。
Browser:
<script src='path/to/decimal.js'></script>
<script type="module">
import Decimal from './path/to/decimal.mjs';
...
</script>
npm install decimal.js
const Decimal = require('decimal.js');
import Decimal from 'decimal.js';
import {Decimal} from 'decimal.js';
In all examples below, semicolons and 在下面的所有示例中,未显示分号和toString
calls are not shown. toString
调用。If a commented-out value is in quotes it means 如果注释掉的值在引号中,则表示前面的表达式调用了toString
has been called on the preceding expression.toString
。
The library exports a single constructor function, 库导出单个构造函数Decimal
, which expects a single argument that is a number, string or Decimal instance.Decimal
,该函数需要一个参数,即数字、字符串或Decimal实例。
x = new Decimal(123.4567)
y = new Decimal('123456.7e-3')
z = new Decimal(x)
x.equals(y) && y.equals(z) && x.equals(z) // true
If using values with more than a few digits, it is recommended to pass strings rather than numbers to avoid a potential loss of precision.如果使用的值超过几个数字,建议传递字符串而不是数字,以避免潜在的精度损失。
// Precision loss from using numeric literals with more than 15 significant digits.
new Decimal(1.0000000000000001) // '1'
new Decimal(88259496234518.57) // '88259496234518.56'
new Decimal(99999999999999999999) // '100000000000000000000'
// Precision loss from using numeric literals outside the range of Number values.
new Decimal(2e+308) // 'Infinity'
new Decimal(1e-324) // '0'
// Precision loss from the unexpected result of arithmetic with Number values.
new Decimal(0.7 + 0.1) // '0.7999999999999999'
As with JavaScript numbers, strings can contain underscores as separators to improve readability.与JavaScript数字一样,字符串可以包含下划线作为分隔符,以提高可读性。
x = new Decimal('2_147_483_647')
String values in binary, hexadecimal or octal notation are also accepted if the appropriate prefix is included.如果包含适当的前缀,也可以接受二进制、十六进制或八进制表示的字符串值。
x = new Decimal('0xff.f') // '255.9375'
y = new Decimal('0b10101100') // '172'
z = x.plus(y) // '427.9375'
z.toBinary() // '0b110101011.1111'
z.toBinary(13) // '0b1.101010111111p+8'
// Using binary exponential notation to create a Decimal with the value of `Number.MAX_VALUE`.
x = new Decimal('0b1.1111111111111111111111111111111111111111111111111111p+1023')
// '1.7976931348623157081e+308'
Decimal instances are immutable in the sense that they are not changed by their methods.十进制实例是不可变的,因为它们不会被其方法更改。
0.3 - 0.1 // 0.19999999999999998
x = new Decimal(0.3)
x.minus(0.1) // '0.2'
x // '0.3'
The methods that return a Decimal can be chained.返回Decimal的方法可以被链接。
x.dividedBy(y).plus(z).times(9).floor()
x.times('1.23456780123456789e+9').plus(9876.5432321).dividedBy('4444562598.111772').ceil()
Many method names have a shorter alias.许多方法名称的别名较短。
x.squareRoot().dividedBy(y).toPower(3).equals(x.sqrt().div(y).pow(3)) // true
x.comparedTo(y.modulo(z).negated() === x.cmp(y.mod(z).neg()) // true
Most of the methods of JavaScript's JavaScript的Number.prototype
and Math
objects are replicated.Number.prototype
和Math
对象的大多数方法都是复制的。
x = new Decimal(255.5)
x.toExponential(5) // '2.55500e+2'
x.toFixed(5) // '255.50000'
x.toPrecision(5) // '255.50'
Decimal.sqrt('6.98372465832e+9823') // '8.3568682281821340204e+4911'
Decimal.pow(2, 0.0979843) // '1.0702770511687781839'
// Using `toFixed()` to avoid exponential notation:为了避免指数表示法:
x = new Decimal('0.0000001')
x.toString() // '1e-7'
x.toFixed() // '0.0000001'
And there are 还有isNaN
and isFinite
methods, as NaN
and Infinity
are valid Decimal
values.isNaN
和isFinite
方法,因为NaN
和Infinity
是有效的十进制值。
x = new Decimal(NaN) // 'NaN'
y = new Decimal(Infinity) // 'Infinity'
x.isNaN() && !y.isNaN() && !x.isFinite() && !y.isFinite() // true
There is also a 还有一个带有可选最大分母参数的toFraction方法。toFraction
method with an optional maximum denominator argument.
z = new Decimal(355)
pi = z.dividedBy(113) // '3.1415929204'
pi.toFraction() // [ '7853982301', '2500000000' ]
pi.toFraction(1000) // [ '355', '113' ]
All calculations are rounded according to the number of significant digits and rounding mode specified by the 所有计算都根据Decimal构造函数的precision
and rounding
properties of the Decimal constructor.precision
和rounding
属性指定的有效位数和舍入模式进行舍入。
For advanced usage, multiple Decimal constructors can be created, each with their own independent configuration which applies to all Decimal numbers created from it.对于高级用法,可以创建多个Decimal构造函数,每个构造函数都有自己的独立配置,该配置适用于从中创建的所有Decimal数字。
// Set the precision and rounding of the default Decimal constructor设置默认Decimal构造函数的精度和舍入
Decimal.set({ precision: 5, rounding: 4 })
// Create another Decimal constructor, optionally passing in a configuration object创建另一个Decimal构造函数,可选地传入配置对象
Dec = Decimal.clone({ precision: 9, rounding: 1 })
x = new Decimal(5)
y = new Dec(5)
x.div(3) // '1.6667'
y.div(3) // '1.66666666'
The value of a Decimal is stored in a floating point format in terms of its digits, exponent and sign, but these properties should be considered read-only.Decimal的值按其数字、指数和符号以浮点格式存储,但这些属性应视为只读。
x = new Decimal(-12345.67);
x.d // [ 12345, 6700000 ] digits (base 10000000)
x.e // 4 exponent (base 10)
x.s // -1 sign
For further information see the API reference in the doc directory.有关更多信息,请参阅doc目录中的API参考。
To run the tests using Node.js from the root directory:要从根目录使用Node.js运行测试,请执行以下操作:
npm test
Each separate test module can also be executed individually, for example:每个单独的测试模块也可以单独执行,例如:
node test/modules/toFraction
To run the tests in a browser, open test/test.html.要在浏览器中运行测试,请打开test/tes.html。
Two minification examples:两个缩小示例:
Using uglify-js to minify the decimal.js file:使用uglify-js缩小decimal.js文件:
npm install uglify-js -g
uglifyjs decimal.js --source-map url=decimal.min.js.map -c -m -o decimal.min.js
Using terser to minify the ES module version, decimal.mjs:使用terser缩小ES模块版本decimal.mjs:
npm install terser -g
terser decimal.mjs --source-map url=decimal.min.mjs.map -c -m --toplevel -o decimal.min.mjs
import Decimal from './decimal.min.mjs';