浮点精度 加减乘除 原生方法

2023-11-12

关于JavaScript 二进制精度问题,浮点数的计算精度会存在缺失问题。

专门去百度了一下解决方案,发现有的不是很全,再不就是在项目里面使用会报错(不支持with用法)等等问题。所以针对这四个方法 自己 写了一下。

 一般我们是放在utils或者commonJS;或者基于这四个再封装成一个函数进行调用;

加法函数:

/**
 ** 加法函数,用来得到精确的加法结果
 ** 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
 ** 调用:accAdd(arg1,arg2)
 ** 返回值:arg1加上arg2的精确结果
 **/
export function accAdd(arg1, arg2) {
    let r1, r2, m, n;
    let reg = /^\d+$|^\d+[.]?\d+$/;
    if(reg.test(arg1) && reg.test(arg2)) {
        r1 = arg1.toString();
        r2 = arg2.toString();
    } else {
        return false //请输入数字
    }
    if(r1.indexOf('.') !=-1) {
        m = r1.split('.')[1].length;
    } else {
        m = 0
    }
    if(r2.indexOf('.') !=-1) {
        n = r2.split('.')[1].length;
    } else {
        n = 0
    }
    m = Math.pow(10, Math.max(m, n))
    return (arg1 * m + arg2 * m) / m
}

减法函数:

/**
 ** 减法函数,用来得到精确的减法结果
 ** 说明:javascript的减法结果会有误差,在两个浮点数相减的时候会比较明显。这个函数返回较为精确的减法结果。
 ** 调用:accSub(arg1,arg2)
 ** 返回值:arg1加上arg2的精确结果
 **/
export function accSub(arg1, arg2) {
    let r1, r2, m, n, t1, t2;
    let reg = /^\d+$|^\d+[.]?\d+$/;
    if(reg.test(arg1) && reg.test(arg2)){
        r1 = arg1.toString();
        r2 = arg2.toString();
    } else {
        return false //请输入数字
    }
    if(r1.indexOf('.') !=-1) {
        t1 = r1.split('.')[1].length;
    } else {
        t1 = 0
    }
    if(r2.indexOf('.') !=-1) {
        t2 = r2.split('.')[1].length;
    } else {
        t2 = 0
    }
    m = Math.pow(10, Math.max(t1, t2));
    n = t1 >= t2 ? t1 : t2;
    return ((arg1 * m - arg2 * m) / m).toFixed(n);
}

乘法函数:

/**
 ** 乘法函数,用来得到精确的乘法结果
 ** 说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
 ** 调用:accMul(arg1,arg2)
 ** 返回值:arg1乘以 arg2的精确结果
 **/
export function accMul(arg1, arg2) {
    let r1, r2;
    let m = 0
    let reg = /^\d+$|^\d+[.]?\d+$/;
    if(reg.test(arg1) && reg.test(arg2)){
        r1 = arg1.toString();
        r2 = arg2.toString();
    } else {
        return false //请输入数字
    }
    m += r1.split('.')[1] ? r1.split('.')[1].length : 0;
    m += r2.split('.')[1] ? r2.split('.')[1].length : 0;
    return (Number(r1.replace('.', '')) * Number(r2.replace('.', ''))) / Math.pow(10, m)
}

除法函数:

/**
 ** 除法函数,用来得到精确的除法结果
 ** 说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
 ** 调用:accDiv(arg1,arg2)
 ** 返回值:arg1除以arg2的精确结果
 **/
export function accDiv(arg1, arg2) {
    let r1, r2, m1, m2, t1, t2;
    let reg = /^\d+$|^\d+[.]?\d+$/;
    if(reg.test(arg1) && reg.test(arg2)){
        r1 = arg1.toString();
        r2 = arg2.toString();
    } else {
        return false //请输入数字
    }
    if(r1.indexOf('.') !=-1) {
        m1 = r1.split('.')[1].length
    } else {
        m1 =0
    }
    if(r2.indexOf('.') !=-1) {
        m2 = r2.split('.')[1].length
    } else {
        m2 = 0
    }
    t1 = Number(r1.replace('.', ''))
    t2 = Number(r2.replace('.', ''))
    return (t1 / t2) * Math.pow(10, m2 - m1)
}

^-^ (if else 可能有点多,便于理解。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浮点精度 加减乘除 原生方法 的相关文章

  • 从 thymeleaf 获取数据到模态引导程序、jquery

    我正在尝试获取模态视图的 id 这是为了更新 onclick 元素 但我找不到方法 知道如何为 boostrap 5 完成此操作 或我可以用其他方法吗 谢谢 tr a inactivate a div class modal fade mo
  • 了解设置 JQuery 变量

    了解设置 JQuery 变量 最近 我通过在 StackOverflow 上遇到的另一个问题寻找帮助 了解到如何设置 JQuery 变量 如下所示 您可以通过简单地调用变量来创建输入字段 并且锚变量似乎也定义了样式 var clicked
  • 每 3 秒重复一次动画

    我正在使用 WOW js 和 animate css 现在我正在将 CSS 运行到 Infinite 我想知道如何让我的课程运行 3 秒停止并再次开始到无限 My html img src images fork png class for
  • 尝试将布尔 C# 变量传递给 javascript 变量并将其设置为 true

    在我的 aspx 页面中 我将布尔变量 C 传递给需要布尔类型的 javascript 函数 但遇到了问题 但是 C 变量返回 True 而 javascript 不喜欢大写 myjavascript 如果我将 c 变量转换为字符串 那么我
  • TypeError: props.render 不是一个函数(React hook 形式)

    我将方法作为我用react hook form制作的形式的道具传递 当从react hook form添加控制器时 它给了我 TypeError props render不是一个函数 我在网上找不到任何解决方案 因此感谢任何帮助 impor
  • 如何重定向到 instagram://user?username={username}

    我的 html 页面上有这个链接 可以在特定用户上打开 Instagram 应用程序 a href Link to Instagram Profile a 我一直在寻找自动运行 url instagram user username USE
  • 如何重置使用 JavaScript 更改的 CSS 属性?

    我的导航按钮的宽度从 100px 增加到 150px 当鼠标悬停在 nav li hover width 150px 但是使用 javascript 我已经做到了 无论选择哪个选项 宽度都将继续为 150px 当选择每个选项时 它会使其他选
  • 检查 JavaScript 字符串是否为 URL

    JavaScript 有没有办法检查字符串是否是 URL 正则表达式被排除在外 因为 URL 很可能是这样写的stackoverflow 也就是说它可能没有 com www or http 如果你想检查一个字符串是否是有效的 HTTP UR
  • 使用 Angular 下载具有动态 src 的脚本

    Angular 提供了通过动态名称动态加载模板的方法ng include 该部分中的内联 JS 和 CSS 可以正常加载 但没有一个好的方法来下载带有动态 url 的脚本 我们需要下载脚本 相对于调用它们的 html 部分的路径 即我们有一
  • 如何将 Google Charts 与 Vue.js 库一起使用?

    我正在尝试使用 Vue js 库使用 Google Charts 制作图表 但我不知道如何添加到 div 这是我尝试做的 这是如何使用普通 javascript 添加图表 这是文档的代码示例 https developers google
  • Meteor - 从客户端取消服务器方法

    我正在通过服务器方法执行数据库计数 用户可以选择他们希望如何执行计数 然后调用该方法 我的问题是 计数可能需要一些时间 并且用户可能会在方法运行时改变主意并请求不同的计数 有什么方法可以取消调用的方法并运行新的计数吗 我认为 this un
  • Babel 7 Jest Core JS“TypeError:wks不是函数”

    将我的项目升级到 Babel 7 后 通过 Jest 运行测试会抛出以下错误 测试在 Babel 6 中运行没有任何问题 但在 Babel 7 中失败并出现以下错误 TypeError wks is not a function at Ob
  • 如何使输入字段和提交按钮变灰

    我想变灰这两件事 http doorsplit heroku com 歌曲输入字段和提交按钮 直到用户输入艺术家 有没有一种简单的方法可以通过 JQuery 来做到这一点 艺术家输入字段的id是 request artist 你可以这样做
  • 为 illustrator 导出脚本以保存为 web jpg

    任何人都可以帮我为 illustrator CC2017 编写一个脚本 将文件以 JPG 格式导出到网络 旧版 然后保存文件并关闭 我有 700 个文件 每个文件有 2 个画板 单击 文件 gt 导出 gt 另存为 Web 旧版 然后右键文
  • 为什么我不能在 AngularJS 中使用 data-* 作为指令的属性名称?

    On the t他的笨蛋 http plnkr co edit l3KoY3 p preview您可以注意到属性名称模式的奇怪行为data 在指令中 电话 Test of data named attribute br
  • 有没有办法阻止 prettier / prettier-now 将函数参数分解为新行

    当使用 prettier prettier now 在保存时进行格式化时 当一个函数包装另一个函数时 它会中断到一个新行 我想知道是否有办法阻止这种行为 例如 期望的输出 app get campgrounds id catchAsync
  • Safari 支持 JavaScript window.onerror 吗?

    我有一个附加到 window onerror 的函数 window onerror function errorMsg url line window alert asdf 这在 firefox chrome 和 IE 中工作正常 但在 s
  • JQuery 图像上传不适用于未来的活动

    我希望我的用户可以通过帖子上传图像 因此 每个回复表单都有一个上传表单 用户可以通过单击上传按钮上传图像 然后单击提交来提交帖子 现在我的上传表单可以上传第一个回复的图像 但第二个回复的上传不起作用 我的提交过程 Ajax 在 php 提交
  • 如何在 pg-promise 中设置模式

    我正在搜索的文档pg 承诺 https github com vitaly t pg promise特别是在创建客户端时 但我无法找到设置连接中使用的默认架构的选项 它始终使用public架构 我该如何设置 通常 为数据库或角色设置默认架构
  • fullCalendar 未显示正确的结束日期

    我正在看调试页面 http jsbin com wukofacaxu edit js outputFullCalendar 官方网站的 我想安排一个活动时间为 22 09 2015 至 30 09 2015 dd mm yyyy 但它只显示

随机推荐

  • vue实现文件批量上传及进度条展示

    主要实现功能 1 多文件拖拽上传 2 显示文件上传进度条 3 上传期间 还可以继续拖拽上传 4 可以支持手动修改上传并发任务数 5 上传失败自动重试 最大重试次数3次 6 上传过程中可以手动取消上传 本次使用的是element ui 上传拖
  • CUDA实现多batch基数排序

    CUDA实现多batch基数排序 基数排序是具有固定迭代次数的排序算法 其通过对最低位到最高位的一一比较 对数值排序 GPU版的基数排序将数据分为N个部分并行进行基数排序 随后并行规约得到排序后的数组 这里实现了一版多batch的基数排序实
  • 对stdin,stdout 和STDOUT_FILENO,STDIN_FILENO的学习

    在unix系统调用中 标准输入描述字用stdin 标准输出用stdout 标准出错用stderr表示 但在一些调用函数 引用了STDIN FILENO表示标准输入才 同样 标准出入用STDOUT FILENO 标准出错用STDERR FIL
  • C# 异步编程的三种方式

    一 通过委托实现异步 namespace Test1 class AsyncDemo public void async string i 参数 Console WriteLine 调用异步方法前 PostAsync i Console W
  • Java api中文在线版

    转载自 http blog csdn net qw599186875 article details 52265995ticket ST 213719 sl0mP1mtz9GcbY44tTbE passport csdn net java
  • 在Linux虚拟机上安装QT

    一 安装虚拟机 运行VMware workstation full 11 1 0 2496824 exe 二 在虚拟机上安装Linux 1 下载Ubuntu桌面版 从官网进入 选择 桌面版 按照提示进行下载 国内的一个镜像网址是 http
  • NC65 查询模板参照字段启用参照是否包含下级

    NC65 查询模板参照字段 勾选参照是否包含下级时 选择完参照字段返回的查询条件 参照字段的值是一个sql语句 无法查询到正确数据 当查询模板字段勾选了是否查询条件时 通过getQryDLGDelegator getGeneralCondt
  • 华为有没有公开鸿蒙系统,华为捐赠鸿蒙最核心基础架构该如何看待?

    原标题 华为捐赠鸿蒙最核心基础架构该如何看待 6月2日 华为 鸿蒙操作系统 正式发布 这是一款面向全场景的分布式操作系统 和苹果安卓等手机电脑系统不同 鸿蒙系统可用于物联网各种设备 从目前市场上的操作系统市场比例上看 安卓占据了全球68 6
  • 拉链表设计详解

    拉链表设计原理 将拉链表和每日增量数据做左连接 每日增量没有匹配的数据和拉链表endtime lt 99991231的数据保持不变 其他的endtime变为每日增量的starttime 1 如果数据发生修改 拉链表和增量数据左连接 将拉链表
  • Flask之methods、url_for进行反解析、request的使用、上传文件、abort函数与自定义异常处理、元组、使用jsonify返回json数据、设置和读取cookie

    Flask利用methods限制访问方式 在flask中 可以使用在路由装饰器中使用methods 访问方式 同一视图中可以同时存在多种访问方式 通过methods限定访问方式 app route post only methods POS
  • docker-py(Docker SDK for Python)使用指南

    文章目录 前言 1 docker客户端 2 docker镜像 3 docker容器 4 使用示例 结束语 前言 本篇博客围绕官方提供的python版的docker Engine API Docker SDK for Python 结合具体示
  • 敏感数据明文传输(密码)

    1 加密过程 加密分为单向和双向 拿登录功能来说 密码的加密发送 双向加密就是可逆的 这边加密 那边解密后跟数据库里的密码比对 单向是不可逆的 这边加密 那边无法解密 比对的方式是从数据库里拿出该用户的密码 进行同样的加密 比对加密后的值是
  • Python 下opencv 应用: 物体数数

    物体数数 物体个数计算 就是计算一个图形中有多少物体 python 下用opencv 打开一个图形文件 图形处理 计算图中物体的个数 除了opencv 要安装好外 还要装好 imutils imutils 的下载和安装在 Python 下应
  • 【深入理解C++】给表达式赋值

    在 C 语言中表达式是不可以被赋值的 但是在 C 中可以 include
  • linux设备驱动之USB主机控制器驱动分析

    inux设备驱动之USB主机控制器驱动分析 本文系本站原创 欢迎转载 转载请注明出处 http ericxiao cublog cn 一 前言 Usb是一个很复杂的系统 在usb2 0规范中 将其定义成了一个分层模型 linux中的代码也是
  • npm安装指定版本的npm、typescript、yarn、lerna并查看版本号+nvm安装切换不同版本node

    nvm安装后 nvm ls列出所有node已安装版本 nvm install 版本号 安装node指定版本 nvm use 版本号 使用 切换 node版本 要使用nvm才能安装npm 先全局卸载 npm uninstall g types
  • 数据库判断

    正确 索引可以加快数据的查找速度 但是会给数据更新带来额外性能消耗 数据库管理系统软件都是基于某种数据模型而设计的 逻辑模型和物理模型都是按照计算机系统的观点对数据建模的 所有教师抽象为一类实体 使用 教师 工号 姓名 性别 表达起来的概念
  • 全连接层

    1 将前一层输出的二维特征图综合起来转化为一维向量 它的每一个节点都与上一层的每个节点连接 2 全连接层的主要作用是将输入图像在经过卷积和池化操作后提取的特征进行压缩 并且根据压缩的特征完成模型的分类功能 在整个卷积神经网络中起到 分类器
  • __attribute__((weak))的使用

    一 背景 我们不确定外部模块是否提供一个函数func 但是我们不得不用这个函数 举个例子 A B两个模块 A模块调用了B模块的函数 但是不确定B模块是否提供了该函数 但是又不得不调用 这个时候在A模块中再申明一个弱符号函数 即用weak 如
  • 浮点精度 加减乘除 原生方法

    关于JavaScript 二进制精度问题 浮点数的计算精度会存在缺失问题 专门去百度了一下解决方案 发现有的不是很全 再不就是在项目里面使用会报错 不支持with用法 等等问题 所以针对这四个方法 自己 写了一下 一般我们是放在utils或