JS浮点计算的问题以及处理

2023-05-16

在使用浮点计算的时候明明1.56+0.07=1.63,小学生都会算的,可是计算机为什么算出来很长一段数字呢?

因为JavaScript 里的数字是采用 IEEE 754 标准的 64 位双精度浮点数。该规范定义了浮点数的格式。

不说话直接上代码看看:

<div>
  数字1:<input id="input1" name=""> 
</div>
<div>
  数字2:<input id="input2" name="">
</div>
<div>
  <button id="add">+</button>
  <button id="minus">-</button>
  <button id="multiply">*</button>
  <button id="division">\</button>
</div>
  <div id="result">value</div>
  let input1 = document.getElementById('input1');
  let input2 = document.getElementById('input2');
  let btn1 = document.getElementById('add');
  let btn2 = document.getElementById('minus');
  let btn3 = document.getElementById('multiply');
  let btn4 = document.getElementById('division');
  let result = document.getElementById('result');
  //加
  btn1.onclick = function () {
    let ss = parseFloat(input1.value) + parseFloat(input2.value);
    result.innerHTML = ss;
  }
   //减
  btn2.onclick = function () {
    let ss = parseFloat(input1.value) - parseFloat(input2.value);
    result.innerHTML = ss;
  }
  //乘
  btn3.onclick = function () {
    let ss = parseFloat(input1.value) * parseFloat(input2.value);
    result.innerHTML = ss;
  }
  //除
  btn4.onclick = function () {
    let ss = parseFloat(input1.value) / parseFloat(input2.value);
    result.innerHTML = ss;
  }

运行一下加法看看结果~~~

处理方法

重新写了一些浮点运算的函数或直接扩大倍数运算。

下面以扩大倍数运算举例子:【原理把小数变成整数,然后做运算处理,再除以放大倍数】

//修改之后的加法
  function Add(arg1, arg2) {
    var r1, r2, m;
    try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
    try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
    m = Math.pow(10, Math.max(r1, r2))
    return (arg1 * m + arg2 * m) / m
  }
  //修改之后的减法
  function Minus(arg1, arg2) {
    var r1, r2, m, n;
    try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
    try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
    m = Math.pow(10, Math.max(r1, r2));
    //动态控制精度长度
    n = (r1 >= r2) ? r1 : r2;
    return ((arg1 * m - arg2 * m) / m).toFixed(n);
  }
  //修改之后的乘法
  function Multiply(arg1, arg2) {
    var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
    try { m += s1.split(".")[1].length } catch (e) { }
    try { m += s2.split(".")[1].length } catch (e) { }
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
  }
  //修改之后的除法
  function Division(arg1, arg2) {
    var t1 = 0, t2 = 0, r1, r2;
    try { t1 = arg1.toString().split(".")[1].length } catch (e) { }
    try { t2 = arg2.toString().split(".")[1].length } catch (e) { }
    with (Math) {
      r1 = Number(arg1.toString().replace(".", ""))
      r2 = Number(arg2.toString().replace(".", ""))
      return (r1 / r2) * pow(10, t2 - t1);
    }
  }

这种方式虽然解决部分问题,但是还是无法解决小数点过长的时候。当小数点后多过7位基本上计算出来都会失去精度。

解决方案可以引入库:bignumber

<script src="https://cdn.bootcdn.net/ajax/libs/bignumber.js/9.0.1/bignumber.js"></script>
<script>
const xx = new BigNumber('123456859.456156165196161');
console.log(xx.div(1.2).toString);
</script>

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

JS浮点计算的问题以及处理 的相关文章

  • 统计案例 | 三门问题

    统计案例 三门问题 一 前言二 背景三 思路1 xff1a 直观解释四 思路2 xff1a 列出概率空间与所有事件五 思路3 xff1a 条件概率法六 思路4 xff1a Python模拟七 写在最后 一 前言 今天小编和各位小伙伴来聊一档
  • 详解远程桌面协议, Linux 和 Windows 间的远程桌面互相访问(RDP、VNC协议)

    前言 xff1a 远程协议有很多 xff0c 本文只讨论几种主要的 xff0c 另外由于Windows之间的远程桌面工具实在是太多了 xff0c 这里就不再说明 xff0c 主要以Windows和Linux之间的互相访问来说明 一 常见的远
  • SQL 2012 解析JSON字符串

    Object UserDefinedFunction dbo parseJSON Script Date 2019 12 17 11 30 01 SET ANSI NULLS ON GO SET QUOTED IDENTIFIER ON G
  • nextcloud+onlyoffice docker-compose创建私有云

    nextcloud镜像 分两种镜像 xff1a nextcloud latest nextcloud镜像默认对应的是apache web服务器版本nextcloud fpm 基于php fpm镜像 xff0c 并运行fastCGI Proc
  • 发布到IIS后,后端拒绝put和delete请求

    系统在本地没有问题 xff0c 发布到服务器上后 xff0c put和delete请求不行 报跨域的错误 原因 xff1a IIS8默认会拒绝delete和put请求 解决方法 xff1a 删除IIS模块里面的WebDAVModule
  • Linux入门之使用 ping 命令检测主机是否激活

    文档 Ping command basics for testing and troubleshooting Enable Sysadmin ping 8 Linux manual page 1 简介 ping 命令向网络主机发送 ICMP
  • Linux入门之使用 traceroute 追踪数据包传输路径

    文档 https en wikipedia org wiki Traceroute https www geeksforgeeks org traceroute command in linux with examples Ping tra
  • ubuntu16.04安装NVIDIA显卡驱动

    文章目录 1 用系统适配的方式安装显卡驱动2 用命令行的方式安装从NVIDIA官网上下载的显卡驱动2 1 下载显卡驱动2 2 卸载原有驱动2 3 禁用nouveau2 4 安装nvidia显卡驱动 参考 xff1a ubuntu操作系统下安
  • Linux入门之使用 arp 管理ARP协议缓存

    文档 arp command in Linux with examples GeeksforGeeks 1 简介 arp 命令操作系统的 ARP 缓存 它还允许完整转储 ARP 缓存 ARP 代表地址解析协议 该协议的主要功能是将系统的IP
  • Linux入门之使用 dig 查找域名

    文档 https en wikipedia org wiki Dig command dig Command in Linux with Examples GeeksforGeeks 1 简介 dig是用于查询域名系统 DNS 的网络管理
  • Linux入门之使用 dmesg 查看引导日志

    文档 https en wikipedia org wiki Dmesg dmesg 1 Linux manual page 1 简介 在许多 Linux 系统上 引导过程会生成特别密集的内核消息流 许多管理问题与引导过程中是否成功枚举所需
  • http协议入门之 SameSite cookies

    文档 SameSite cookies HTTP MDN SameSite cookies explained 1 简介 响应标头 Set Cookie 的SameSite属性允许声明 cookie 是否应限制为第一方或同一站点上下文 准确
  • cloudflare入门之 /cdn-cgi/ 端点

    1 简介 将域添加到 Cloudflare时 xff0c Cloudflare 会向该域添加一个 cdn cgi 端点 此端点由 Cloudflare 管理 它不能被修改或定制 一些使用此端点的例子包括 xff1a Cloudflare 机
  • cloudflare入门之附加 cookie

    文档 Cloudflare Cookies Cloudflare Fundamentals docs 1 简介 Cloudflare 使用 cookie 来最大化网络资源 管理流量并保护网站免受恶意流量的侵害 2 cflb 使用Cloudf
  • Linux入门之使用 ps 查看系统进程

    文档 PS Command ps command in Linux with Examples GeeksforGeeks ps 1 Linux manual page 1 简介 ps命令允许显示有关正在运行的进程的信息 它从 proc文件
  • Linux入门之使用 top 查看系统进程

    文档 Top command top command in Linux with Examples GeeksforGeeks top 1 Linux manual page 1 简介 top命令显示系统上正在运行的进程的实时列表 还显示有
  • android入门之使用 adb 进行屏幕截图

    文档 xff1a https developer android com studio command line adb screencap 1 进入shell adb shell shell 64 2 截图 在 shell 里进行截图 x
  • node.js实战之使用 jsdom

    文档 GitHub jsdom jsdom 1 简介 jsdom 是许多 web 标准的纯 JavaScript 实现 特别是 WHATWG DOM和HTML标准 该项目的目标是模拟足够多的 Web 浏览器子集 以用于测试和抓取真实世界的
  • CentOS-7 MySQL 5.7.20安装

    1 检查系统是否安装了mariadb rpm qa grep mariadb 发现已经安装 xff0c 卸载 rpm e nodeps mariadb libs 5 5 52 1 el7 x86 64 2 创建mysql用户组和mysql用

随机推荐

  • mac os入门之安装 brew

    nbsp 文档 The Missing Package Manager for macOS or Linux Homebrew 1 简介 Homebrew 安装了Apple 或 Linux 系统 不需要的东西 nbsp Homebrew 将
  • node.js入门之 mac os下安装 nvm

    1 安装 安装脚本与 linux 下一样 wget qO https raw githubusercontent com nvm sh nvm v0 39 1 install sh bash gt Downloading nvm from
  • make入门之编写 makefile

    文档 GNU make 1 简介 Makefile 包含五种内容 显式规则 隐式规则 变量定义 指令和注释 显式规则 何时及如何重新制作目标 列出了依赖的先决条件 提供创建或更新目标的配方 隐式规则 何时及如何根据文件名重新制作目标 描述如
  • 记一个 Nvidia Control Panel 打不开的问题

    1 简介 Nvidia Control Panel 打不开 xff0c 找到了应用点击没反应 2 解决 找到 NVIDIA Display Container LS 服务 xff0c 启动后 xff0c 右下角出现 NVIDIA 图标 右键
  • 记一个 Europe/Pari 时区冬令时从+2:00变成+1:00问题

    1 简介 代码里写死了时区 Europe Paris xff0c 而且时间点都是以文字时区为准 但是今天发现 xff0c 在本地对应的时间没有运行 最后发现 xff0c 之前Europe Paris 是 43 2 00 xff0c 早上10
  • android入门之 Support Library

    Use legacy support library option in android Stack Overflow https developer android com topic libraries support library
  • 记一个 react 配置路由前缀问题

    react 配置路由前缀需要注意两点 1 资源使用相对路径 默认情况下 xff0c react 编译后的资源使用根路径 xff0c 也就是长下面这样 lt script src 61 34 static js 2 dfc7d8c4 chun
  • nginx 配置SPA应用路由前缀

    1 配置 location xxx alias your directory try files uri uri xxx index html 路由匹配要使用 用 alias 改变当前目录 try files 的最后一个回退项目也必须有前缀
  • geckodriver selenium火狐浏览器驱动

    火狐浏览器驱动对浏览器版本没什么大的要求 xff0c 直接下载这个压缩包就可以 xff0c 在selenium使用中谷歌浏览器bug会很多 xff0c 并非网站反爬 xff0c 火狐或许可以解决 xff0c Releases mozilla
  • B站高清视频下载方法揭密

    有很多文章都介绍过B站的视频如何下载 xff0c 大部分介绍的都是如何通过第三方网站提供的工具下载 xff0c 使用起来有诸多不便 xff0c 也不能实现批量下载 xff0c 今天就给大家介绍一款命令行小工具 xff0c 保证让你爱不释手
  • Android 科大讯飞、语音听写集成指南

    前提说明 xff1a 讯飞SDK与appID xff08 后台申请 xff09 是一一对应的 否则就会导致初始化不成功 xff01 1 创建appID并下载SDK xff08 没有账号的先行注册 xff09 https console xf
  • MCU-51:单片机直流电机驱动(PWM)

    目录 一 直流电机介绍二 电机驱动电路三 PWM3 1 PWM介绍3 2 产生PWM方法 四 代码演示注意 xff1a 一定要看 一 直流电机介绍 直流电机是一种将电能转换为机械能的装置 一般的直流电机有两个电极 xff0c 当电极正接时
  • Java编程经验---比较两个List对象差异

    Java编程经验 比较两个List对象差异 问题引入解决问题简化模型一般的办法速度更快的方法Lambda表达式解决办法 结语 问题引入 如何比较两个List对象的差异 xff0c 这个问题来源于我最近正在开发的新系统中的一个细节 大致情况就
  • iOS UIScrollView不能响应touchBegin的解决方法

    1 新建类别 2 重写以下三个方法 void touchesBegan NSSet touches withEvent UIEvent event self nextResponder touchesBegan touches withEv
  • idea使用原生Servlet-API报错javax.servlet.http不存在

    解决方法
  • Electron安装过慢问题解决方案

    npm install save dev electron 慢到家了 虽然官方也提供了一个方案 xff0c 还是很慢 新的解决方案 修改npm的配置文件 npm config edit 添加配置 electron mirror 61 htt
  • 前端框架篇学习--选择命令式还是声明式

    命令式与声明式定义 大白话 xff1a 假期回家了 xff0c 我想吃老妈的大盘鸡 xff0c 然后老妈就去采购食材 xff0c 剁鸡块 xff0c 卤鸡肉 xff0c 切土豆 xff0c 然后爆炒起来 xff0c 想方设法给我做好吃的大盘
  • 后端-Node(express)连接mongodb到前端-访问接口将数据显示页面(一条龙)

    如果你是前端想步入全栈领域 xff0c 如果你想用Node做一个接口 xff0c 如果你想自己操作一下数据库连接到自己页面的冲动 xff0c 本篇会大大帮助你 xff0c 让你一步一步跨过阻碍 xff0c 到达全栈的第一脚 大概流程 xff
  • Angular4快速获取DOM元素,进行增删改样式等处理

    获取DOM可能会使用原生的 如 xff1a document getElementById 39 id 39 xff1b 或者引入Jquery获取jquery对象获取元素 但在angular中千万别这么使用 因为官网API给我们提供更好的方
  • JS浮点计算的问题以及处理

    在使用浮点计算的时候明明1 56 43 0 07 61 1 63 xff0c 小学生都会算的 xff0c 可是计算机为什么算出来很长一段数字呢 xff1f 因为JavaScript 里的数字是采用 IEEE 754 标准的 64 位双精度浮