资讯专栏INFORMATION COLUMN

js 常用计算

zhaofeihao / 1436人阅读

摘要:常用计算由于存在计算精度的问题,例如,所以需要整理以下方法,方便进行简单计算。主要思路是先转成整数,然后再进行计算,计算完再转回浮点数获取小数位以及向右移动小数位,是计算时转换成整数的工具函数。

js 常用计算

由于存在计算精度的问题,例如 0.1+0.2 = 0.30000000000000004,所以需要整理以下方法,方便进行简单计算。

主要思路是先转成整数,然后再进行计算,计算完再转回浮点数

获取小数位以及向右移动小数位,是计算时转换成整数的工具函数。加减乘除四个函数都用到了
获取小数位
// 获取小数位
export function getDecimalPlace(num) {
    try {
        let result = num.toString().split(".")[1].length;
        return result;
    } catch (e) {
        return 0;
    }
}
向右移动小数位
/**
 * 向右移动小数点
 * @param movePlace 移动步数,正向右,负数向左
 */
export function moveDecimalPlace(num, movePlace) {
    let decimalPlace = getDecimalPlace(num);
    let step = movePlace - decimalPlace;

    // 先转成整数类型,再确定需要如何移动,为了处理 268.34*100 却等于 26833.999999999996 的问题
    let intNum = Number(num.toString().replace(".", ""));
    if (step > 0) {
        return intNum * Math.pow(10, step);
    } else if (step < 0) {
        return intNum / Math.pow(10, -step);
    } else {
        return intNum;
    }
}
这里右移动小数点需要先转成整形,再进一步处理是因为存在一些浮点数乘以 10 的倍数也会出问题!
例如: 268.34*100 => 26833.999999999996
加法
/**
 * 相加  arg1 + arg2
 */
export function add(arg1, arg2) {
    let step1 = getDecimalPlace(arg1);
    let step2 = getDecimalPlace(arg2);

    let maxStep = Math.max(step1, step2);

    arg1 = moveDecimalPlace(arg1, maxStep);
    arg2 = moveDecimalPlace(arg2, maxStep);

    return (arg1 + arg2) / Math.pow(10, maxStep);
}
减法
/**
 * 相减   arg1 - arg2
 */
export function sub(arg1, arg2) {
    return add(arg1, -arg2);
}
乘法
/**
 * 乘法   arg1 * arg2
 */
export function multiply(arg1, arg2) {
    let step1 = getDecimalPlace(arg1);
    let step2 = getDecimalPlace(arg2);

    let maxStep = Math.max(step1, step2);

    arg1 = moveDecimalPlace(arg1, maxStep);
    arg2 = moveDecimalPlace(arg2, maxStep);

    if (maxStep > 0) {
        let stepPow = Math.pow(10, maxStep);
        return (arg1 * arg2) / (stepPow * stepPow);
    }
    return arg1 * arg2;
}
除法
/**
 * 除法   arg1 / arg2
 */
export function division(arg1, arg2) {
    let step1 = getDecimalPlace(arg1);
    let step2 = getDecimalPlace(arg2);

    let maxStep = Math.max(step1, step2);

    arg1 = moveDecimalPlace(arg1, maxStep);
    arg2 = moveDecimalPlace(arg2, maxStep);

    return arg1 / arg2;
}
其他

源码链接

更多代码片段

个人博客链接

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/100253.html

相关文章

  • JS 中的日期时间操作计算实例

    摘要:实例一已知日期格式为,计算相对于今天的天数差。在实践应用中,还会有各种各样的关于时间操作的需求,欢迎补充,我都将一一解答。 实例 一:已知日期格式为 YYYY/MM/DD,计算相对于今天的天数差。 function fromNow(date){ var mTimes = new Date(date); var fromTimes = Date.now() - mTime...

    beanlam 评论0 收藏0
  • vue学习笔记(二)

    摘要:供用户在相应的阶段对其进行操作。我们像下面这样使用这个指令大多数情况下,我们只需要使用与钩子函数。里提供了函数的简写形式钩子函数有两个常用的参数和。其他用法与全局自定义指令一致。 一、vue生命周期 vue实例从创建到销毁的过程,称为生命周期,共有八个阶段。 这八个阶段里分别有一个叫做钩子函数的实例选项。供用户在相应的阶段对其进行操作。 beforeCreate(){ //组件实例刚...

    klivitamJ 评论0 收藏0
  • vue学习笔记(二)

    摘要:供用户在相应的阶段对其进行操作。我们像下面这样使用这个指令大多数情况下,我们只需要使用与钩子函数。里提供了函数的简写形式钩子函数有两个常用的参数和。其他用法与全局自定义指令一致。 一、vue生命周期 vue实例从创建到销毁的过程,称为生命周期,共有八个阶段。 这八个阶段里分别有一个叫做钩子函数的实例选项。供用户在相应的阶段对其进行操作。 beforeCreate(){ //组件实例刚...

    Pines_Cheng 评论0 收藏0
  • vue学习笔记(二)

    摘要:供用户在相应的阶段对其进行操作。我们像下面这样使用这个指令大多数情况下,我们只需要使用与钩子函数。里提供了函数的简写形式钩子函数有两个常用的参数和。其他用法与全局自定义指令一致。 一、vue生命周期 vue实例从创建到销毁的过程,称为生命周期,共有八个阶段。 这八个阶段里分别有一个叫做钩子函数的实例选项。供用户在相应的阶段对其进行操作。 beforeCreate(){ //组件实例刚...

    ideaa 评论0 收藏0

发表评论

0条评论

zhaofeihao

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<