js 小数点精度问题

案列

  // 加法
    0.1 + 0.2 = 0.30000000000000004
    0.7 + 0.1 = 0.7999999999999999
    0.2 + 0.4 = 0.6000000000000001

    // 减法
    1.5 - 1.2 = 0.30000000000000004
    0.3 - 0.2 = 0.09999999999999998
    
    // 乘法
    19.9 * 100 = 1989.9999999999998
    0.8 * 3 = 2.4000000000000004
    35.41 * 100 = 3540.9999999999995

    // 除法
    0.3 / 0.1 = 2.9999999999999996
    0.69 / 10 = 0.06899999999999999

解决方案 - Math.js

对于任意精度的计算,math.js 支持BigNumber 数据类型。

安装

npm install mathjs
请注意,在 TypeScript 项目中使用 mathjs 时,您还必须安装类型定义文件:npm install @types/mathjs.

封装

import * as math from 'mathjs';
export default {
    // 加
	add(num1,num2){
		return Number(math.add(math.bignumber(num1),math.bignumber(num2)));
	},
	// 乘
	multiply(num1,num2){
		return Number(math.multiply(math.bignumber(num1),math.bignumber(num2)));
	},
	// 减
	subtract(num1,num2){
		return Number(math.subtract(math.bignumber(num1),math.bignumber(num2)));
	},
	// 除
	divide(num1,num2){
		return Number(math.divide(math.bignumber(num1),math.bignumber(num2)));
	}
}

使用

import math from './math.js'
let addNum = math.add(3,2); // 5
let mulNum = math.multiply(3,2); // 6
let subNum = math.subtract(3,2); // 1 
let divNum = math.divide(3,2); // 1.5

完美解决~~~
问题的原因
为什么 0.1+0.2 JS加不了?
产生浮点数计算精度不准确的原因: 在计算机角度,计算机算的是二进制,而不是十进制。二进制后变成了无线不循环的数,而计算机可支持浮点数的小数部分可支持到52位,所有两者相加,在转换成十进制,得到的数就不准确了,加减乘除运算原理一样。
在这里插入图片描述

十进制二进制0.10.0001 1001 1001 1001 …0.20.0011 0011 0011 0011 …0.30.0100 1100 1100 1100 …0.40.0110 0110 0110 0110 …0.50.10.60.1001 1001 1001 1001 …
所以两者相加之后得到这么一串 0.0100110011001100110011001100110011001100110011001100 因浮点数小数位的限制而截断的二进制数字,这时候,我们再把它转换为十进制,就成了 0.30000000000000004。
最通俗的解释
比如一个数 1÷3=0.33333333… 大家都知道3会一直无限循环,数学可以表示,但是计算机要存储,方便下次取出来再使用,但0.333333… 这个数 无限循环,你让计算机怎么存储?计算机再大的内存它也存不下,对吧! 所以不能存储一个相对于数学来说的值,只能存储一个近似值,所以当计算机存储后再取出来用时就会出现精度问题。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值