js关于number类型的计算问题

js中关于number类型的计算

因:在js中,number类型是用于表示数值的基本类型,它遵循 IEEE 754 双精度浮点数(64 位)标准。这导致在某些计算中可能出现精度问题。

例:console.log(0.1 + 0.2); // 0.30000000000000004

我这里出于个人习惯,使用三方库big.js来解决精度问题

npm install big.js
import Big from 'big.js';

const a = new Big(0.1);
const b = new Big(0.2);
const result = a.plus(b);

console.log(result.toString()); // "0.3" ✅

顺便贴一下常见用法示例,便于我日后追溯

import Big from 'big.js';

// 创建 Big 实例
const a = new Big(0.1);
const b = new Big(0.2);

// 加法
console.log(a.plus(b).toString()); // "0.3"

// 减法
console.log(b.minus(a).toString()); // "0.1"

// 乘法
console.log(a.times(b).toString()); // "0.02"

// 除法
console.log(b.div(a).toString()); // "2"

// 比较
console.log(a.lt(b)); // true(小于)
console.log(a.eq(b)); // false(等于)

在项目过程中,还有很多实际问题需要考虑,比如:new Big中传入了非法值,(undefined,null,NaN,‘字符串’) 都会出现Invalid number报错。

尝试使用方法

  1. 使用??过滤一下?
b.minus(a ?? 0) // 有很大问题,只能过滤null与undefined,并没有过滤'' 还是会报错,不可取
  1. 使用??‘’
b.minus(((a ?? '') === '') ? 0 : a) // 过滤掉了'',算是解决了大部分问题
  1. 使用函数封装
function safeBig(val: any): Big {
  const num = Number(String(val).trim()) // 这里有个知识点,Number不会抛错,只会返回NaN
  return isFinite(num) ? new Big(num) : new Big(0)
}

// 计算
safeBig(a).minus(safeBig(b))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值