用decimal.js解决JavaScript中计算精度丢失的问题 | 程序员必备小知识

用decimal.js解决JavaScript中计算精度丢失的问题 | 程序员必备小知识小知识,大挑战!!本文介绍用 decimal.js 库解决JavaScript中计算精度丢失的问题。

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

在JavaScript中计算数值的过程中,很容易遇到0.1+0.2!=0.3的问题,其原因是数值由十进制转成双精度浮点数的二进制过程中会出现精度丢失导致的。本文推荐 decimal.js 库来解决此类问题。

官方API文档:地址

安装和引入

执行命令npm i decimal.js --save安装。

import {Decimal} from 'decimal.js'引入使用。

处理数值

在使用decimal.js计算数值前,要先把数值用Decimal处理一下,Decimal是个构造函数,处理后返回一个 decimal对象。

const decimal_10 = new Decimal(10);
console.log(decimal_10)

image.png

Decimal构造函数的参数可以是字符串也可以是数字,字符串只能是表示数字的字符串,如'10',也可以传NaNInfinity

参数前缀为0x0X时表示十六进制,为0b0B时表示二进制,为/0o或 0O时表示八进制。当然这些不常用,了解一下即可。

特别注意要判断参数不能为nullundefined或空值,否会报错。

格式化数值

数值被处理后,不能直接展示到页面,得格式化一下。一般常用的由以下几种。

  • toString() 格式化为字符串。

  • valueOf() 格式化为字符串,但是有符号零 console.log((new Decimal(-0)).valueOf()) // -0

  • toNumber() 格式化为Number类型,转换为原始数字的值。

  • toFixed() 格式化为字符串类型,用法和JS中toFixed()一样,不同的是decimal.js中的toFixed()有第二参数,可以设置舍入的类型。

还要一些不常用的

  • toBinary() 格式化为二进制。

  • toHexadecimal() 格式化为十六进制。

  • toOctal() 格式化为八进制。

加减乘除

在计算中最经常用到就是加减乘除,下面来看一下decimal.js中的加减乘除,有两种用法,一种是使用Decimal类的静态方法,一种是使用Decimal类实例方法。

  • 加法
Decimal.add(1, 2); // 3

const x = new Decimal(1);
const result = x.plus(2); // 3
  • 减法
Decimal.sub(3, 1); // 2

const x = new Decimal(3);
const result = x.sub(1); // 2
  • 乘法
Decimal.mul(3, 2); // 6

const x = new Decimal(3);
const result = x.mul(2); // 6
  • 除法
Decimal.div(6, 2); // 3

const x = new Decimal(6);
const result = x.div(2); // 3

使用除法时候要注意 除数(分母)不能为0。

取绝对值

Decimal.abs(-3); // 3

const x = new Decimal(-3);
const result = x.abs(); // 3

比较

  • 大于
const x = new Decimal(2);
const y = new Decimal(1);
console.log(x.greaterThan(y)); // true
  • 大于等于
const x = new Decimal(2);
const y = new Decimal(2);
console.log(x.greaterThanOrEqualTo(y)); // true
  • 小于
const x = new Decimal(2);
const y = new Decimal(1);
console.log(y.lessThan(x)); // true
  • 小于等于
const x = new Decimal(2);
const y = new Decimal(2);
console.log(y.lessThanOrEqualTo(x)); // true
  • 等于
const x = new Decimal(2);
const y = new Decimal(2);
console.log(x.equals(y)); // true

判断

  • 是否是整数
const x = new Decimal(1) 
x.isInteger(); // true 
const y = new Decimal(123.456) 
y.isInt(); // false
  • 是否是正数
x = new Decimal(0);
x.isPositive();// true
y = new Decimal(-2);
y.isPos(); // false
  • 是否是负数
x = new Decimal(-0); 
x.isNegative(); // true 
y = new Decimal(2); 
y.isNeg(); // false

今天的文章用decimal.js解决JavaScript中计算精度丢失的问题 | 程序员必备小知识分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/19371.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注