JavaScript中浮点数精确值问题

2023-11-16

js中规定安全整数的范围是-2的53次方至2的53次方
也就是-9007199254740992~9007199254740992

在JavaScript中0.1+0.2不等于0.3的问题

0.1+0.2; //0.30000000000000004
0.1+0.2==0.3; //false

浮点数的运算
首先,十进制的0.1和0.2会被转换成二进制的,但是由于浮点数用二进制表示时是无穷的:

0.1 -> 0.0001 1001 1001 1001...( 1100循环)
0.2 -> 0.0011 0011 0011 0011...( 0011循环)

IEEE 754 标准的 64 位双精度浮点数的小数部分最多支持53位二进制位,所以两者相加之后得到二进制为:

0.0100110011001100110011001100110011001100110011001100

因浮点数小数位的限制而截断的二进制数字,再转换为十进制,就成了0.30000000000000004。所以在进行算术计算时会产生误差

我们可以把需要计算的数字升级(乘以10的n次幂)成计算机能够精确识别的整数,等计算完成后再进行降级(除以10的n次幂),这是大部分变成语言处理精度问题常用的方法

( 0.1* 10 + 0.2* 10)/ 10 == 0.3 //true

但依然有误差

35.41 * 100 = 3540.9999999999995

封装函数进行处理:

function operation(a, b, op){
 //将数字进行规范处理,获取源数字与规范的整数的关系及整数值
 //例如  数字1 规范为{1,1}  1/1=1
 //数字12.1  规范为{10,121}    121/10=12.1
 //数字1.21  规范为{100,121}   121/100=1.21
 function floatNum(floatN){
     //判断传入的数值是否为整数
     var isnum = (Math.floor(floatN) === floatN);
     // console.log( isnum );
     var ret = {tims:1, num:0};            
     if( isnum ){
         ret.num = floatN;
     }else{
         var newFloat = floatN + '';//转换为字符串,也可使用toString()方法:floatN.toString()
         var len=newFloat.split('.')[1].length; 
         ret.tims = Math.pow(10, len);            
         ret.num = Number(newFloat.replace('.',''));//转换成整数
     }
     return ret;
 }

 //对处理的数字进行加减乘除的计算
 var numObj1= floatNum(a);
 var numObj2 = floatNum(b);
 var num1 = numObj1.num;
 var num2 = numObj2.num;
 var t1 = numObj1.tims;
 var t2 = numObj2.tims;
 var max = t1>t2 ? t1 : t2;
 var result = null;
 switch(op){
     case 'add':
         if( t1 == t2 ){
             result = num1 + num2;
         }else if(t1 > t2){
             result = num1 + num2*(t1/t2);
         }else{
             result = num1*(t2/t1) + num2;
         }
         return result / max;
     case 'subtract':
         if( t1 == t2 ){
             result = num1 - num2;
         }else if(t1 > t2){
             result = num1 - num2*(t1/t2);
         }else{
             result = num1*(t2/t1) - num2;
         }
         return result / max;
     case 'multiply' :
         result = (num1 * num2) / (t1 * t2);
         return result;
     case 'divide' :
         result = (num1 / num2) * (t1 / t2);
         return result;

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

JavaScript中浮点数精确值问题 的相关文章

  • 从立即调用的匿名函数表达式返回 |它去哪里?

    如果我从立即调用的匿名函数表达式返回一个对象 它会去哪里 例如 这段代码中 foo 去了哪里 function var foo return foo 这有什么有用的应用吗 从自执行函数返回一个值而不将该返回值分配给结果变量只是一个无处可去的
  • 如何在光标下的所有元素上调用 mouseover?

    我有一个网络应用程序 每次单击时都会创建一个点 见下文 当我将鼠标悬停在一堆点上时 我希望光标下的每个点都会触发 mouseover 或 mouseenter 事件 然而 只有一个事件被触发 即堆栈 顶部 的点的事件 当鼠标移动到一堆多个点
  • 在javascript中使用“return !0”有什么意义吗?

    如果您转到谷歌结果页面并运行rwt toString 你会看到这个函数的返回调用是 return 0 我想不出任何理由为什么这不会总是如此true 这只是一个简写吗true 还是还有更多事情发生 总是如此 但下载需要 2 个字节 0是 2
  • 如何使用 axios / jest 测试失败的请求

    我创建了一个非常小的应用程序 如果您传递硬币和数量 它可以计算为某些加密货币支付的总价格 我想测试错误 但我总是收到 收到的承诺已解决而不是被拒绝 我相信这是因为如果 url 错误 axios 仍然会解决承诺 我遇到的第二个问题是 我尝试测
  • 使用闭包和自调用函数制作计数器

    我想知道为什么这段代码不起作用 var uniqueInteger function var counter 0 return function return counter console log uniqueInteger 0 cons
  • 具有行组的 JQuery 斑马条纹表

    我通常将斑马条纹表行设置为奇数 偶数 如下所示 效果很好 table tbody tr visible even this addClass even table tbody tr visible odd this addClass odd
  • 在 JavaScript 中比较表单中的两个数字

    当我尝试比较不同的数字时 数字发生变化 但文本部分保持不变 这只发生在较大 较小的情况下 而不会发生在 NaN 或相等的情况下 这是我的代码 function check var a document getElementById a va
  • 提交前验证表单(比检查空字段更复杂)

    我有一个包含时间输入的表单 具体来说 开放时间和结束时间 当按下提交按钮时 它会转到一个 php 页面 其中这些输入将添加到数据库中 在允许提交表单之前我想检查一些事情 例如 我想确保开始时间早于 小于 结束时间 这是表格 Opens
  • 专用网络:web3.eth.getAccounts() 始终发送空数组

    我正在运行一个私人以太坊网络 我确实用https aws amazon com blockchain templates 整个设置已经完成 AWS 上的设置看起来正确 现在 我正在尝试创建帐户并检索所有这些帐户 为此 我使用以下方法 Web
  • Web SQL 数据库 + Javascript 循环

    我正在尝试解决这个问题 但我自己似乎无法解决 我正在使用 Web SQL DB 但无法让循环正常使用它 I use for var i 0 i lt numberofArticles 1 i db transaction function
  • 如何在 angularjs 中修剪()字符串?

    有角度特定的方法吗 如果没有 我应该使用内置的jquery 来做到这一点吗 如果我应该使用内置的jquery 如何在不使用 的情况下访问trim 函数 或者这是必要的 编辑 是的 我知道 str trim 对不起 我需要这个才能在 IE 8
  • RTCDataChannel发送方法不发送数据

    我的 RTCDataChannel 遇到一个奇怪的问题 我正在对 WebRTC 进行一些研究 并且已经可以进行 WebRTC 音频 视频聊天 现在我想使用 RTCDataChannel 添加文本聊天和文件共享 我已经像这样创建了 RTCDa
  • 使用 Lodash 的 TypeScript:_.map(["123", " 234 "], _.trim) 返回 boolean[]?

    我有一个字符串数组 它们已像这样分割 var searchValue 600 800 123 180 var groups searchValue split gt 600 800 123 180 因此项目周围可能存在空格 并且我想删除空格
  • 为什么我需要 $(document.body) 来使用 Mootools Element 方法扩展 document.body?

    因此 在尝试让我的应用程序在最新的 IE 上运行后 结果发现 IE 不喜欢以下代码 document body getElement className Firefox 和 Chrome 响应良好 但是document bodyIE 上没有
  • 在声明组件选择器时添加指令 - Angular 7

    我正在学习 Angular 并通过单击按钮动态创建组件 我正在尝试使用 Angular Material 的拖放功能来拖动这些创建的组件以对它们进行排序 我的基本组件 html 中有以下代码 div style margin 20px di
  • ThreeJS无法加载Json文件

    首先 我已经读过这个问题 https stackoverflow com questions 17201888 three js exporter export object not working with jsonloader r58没
  • 使用 jQuery Tablesorter 操作后如何恢复当前页面?

    我正在使用 tablesorter 但无法找到有关插件 tablesorter 寻呼机的任何文档 问题是我有一个显示一些数据的表 并且在每一行中都有一个删除链接 该链接附加了要删除的元素的唯一标识符 显然 是否可以保存我正在删除的页面 然后
  • Dojo/on 和捕获阶段

    有没有办法用 dojo on 在捕获阶段 而不是冒泡阶段 触发事件 我最终在这里寻找有关 on 的前身 dojo connect 的信息 就其价值而言 dojo connect 似乎不支持捕获阶段的事件侦听器 它的工作原理是将事件处理程序作
  • 如何根据所需表单输入的值更改 CSS 样式

    我想知道如何编写 javascript 来改变所需的表单元素的样式 如果它们有价值的话就改变它们 我想要做的是当所需的文本字段为空时 在它们周围有一个彩色边框 并在它们有值时删除边框样式 我想做的是编写一个 javascript 函数来检查
  • 如何在 JavaScript 中获取浮点数的小数位?

    我想要的是与 Number prototype toPrecision 几乎相反的 这意味着当我有数字时 它有多少位小数 例如 12 3456 getDecimals 4 对于任何想知道如何更快地完成此操作 无需转换为字符串 的人 这里有一

随机推荐

  • 【转】开发基于ASP.NET WebService的图片验证码服务

    原文地址 http www webjx com htmldata 2006 01 21 1137824356 html 最近 工作中接到一项任务 开发一个页面验证码功能 查阅了一些网上的资料 并结合以前的绘图方面的知识 实现了如下的解决方案
  • CodeFun如期而至

    背景 将设计稿转代码是前端工程师日常不断重复的工作 这部分工作复杂度较低但工作占比较高 往往又比较枯燥繁琐 有时候开发迭代周期短 静态页面又多 常常让有些前端开发苦不堪言 那么 有没有一款设计稿自动生成代码的工具 减少前端工程师的工作量 提
  • node.js

    node js 关于报错及解决方案 问题一 问题二 问题三 一 Node js基础 1 认识Node js 2 开发环境搭建 3 模块 包 commonJS 4 Npm Yarn 5 内置模块 6 路由 二 Express 1 特色 2 安
  • hadoop 学习笔记

    基于hadoop的贝叶斯文本分类器实现过程 贝叶斯基础理论 这个东西的项目概览 对这个工程总体的流程可以参考这个文献里面的做法即可 参考文献1 远程原件目录 user coderlau input hadoop文件系统命令行主要是hdfs
  • android 电视安装apk文件夹,智能电视无法识别apk文件怎么办?简单几招教你搞定...

    在双十一购买完智能电视后 安装自己喜欢的软件 或许是在正常不过的事情了 但有时候我们会碰到一些APK无法识别 这个时候还以为会认为自己买的是假货 但实际上 这并不是电视的问题 而今天小编就教大家 一旦碰倒APK无法识别时应该如何解决 帮助你
  • 常用语言单元测试框架入门

    本文主要介绍Python java go C OC常用单元测试框架 用于了解各种语言单测 一 python单元测试Pytest 1 Pytest主要功能 pytest是python的一种单元测试框架 同自带的Unittest测试框架类似 相
  • 2023 最新互联网大厂Java面经分享:25 分类、1000 道 Java 面试真题(50w 字解析)

    作为 Java 程序员 选择学习什么样的技术 什么技术该不该学 去招聘网站上搜一搜 看看岗位要求就十分清楚了 自己具备的技术和能力 直接影响到你工作选择范围和能不能面试成功 如果想进大厂 那就需要在 Java 核心技术栈上面好好准备了 具体
  • 通过增加模型的大小来加速Transformer的训练和推理

    点击上方 AI公园 关注公众号 选择加 星标 或 置顶 作者 Eric Wallace 编译 ronghuaiyang 导读 你没有看错 确实是通过增大模型的大小 大家别忘了 在训练的时候 有个隐含条件 那就是模型需要训练到收敛 模型训练会
  • SQL Server 变量

    变量的种类 在T SQL中 变量按照生存范围分为 局部变量和 全局变量 1 全局变量是由系统定义的 在整个SQL Server实例内都能访问到的变量 以 作为第一个字符 用户只能访问 不可以赋值 2 局部变量由用户定义 生命周期只在一个批处
  • 哈希函数的特征_哈希函数及其特征

    哈希函数的特征 Prerequisite Hashing data structure 先决条件 哈希数据结构 The hash function is the component of hashing that maps the keys
  • 机器学习之SVM支持向量机

    目录 经典SVM 软间隔SVM 核SVM SVM分类器应用于人脸识别 SVM优点 SVM缺点 经典SVM 支持向量机 Support Vector Machine SVM 是一种二分类模型 其基本思想是在特征空间中找到一个最优的超平面 使得
  • UWB系统的定位精度影响因素

    UWB系统的定位精度影响因素 影响UWB定位精度的因素较多 主要包括 多径效应 非视距传播 多址干扰 参考基站数量 参考基站位置和时钟同步误差等因素 1 多径效应 超宽带信号在室内传播过程中受到复杂的室内环境 如墙体 窗体及室内障碍物等 的
  • go的配置文件

    go湖南老乡 2018 2 5 17 55 54 package main import github com kylelemons go gypsy yaml fmt type reply to findnode neighbors st
  • 初学者用Eclipse和IDEA哪个好用一点?

    idea 毫无疑问 它已经强大到各处吊打eclipse了 新人更是推荐idea 它的语法提示十分智能 假如你写了一段很傻的代码 它会提示你使用更优写法 只需要点一下就可以自动变成更优写法了 普通for自动转增强for 自动转lambda语法
  • SpringBoot版本升级 2.4.5-->2.7.9 遇到的问题

    原项目功能部署 SpringCache Swagger 项目Boot版本升级遇到的问题 问题一 无法启动 报错信息为 org springframework context ApplicationContextException Faile
  • 查看Mysql表的引擎

    show create table 表名
  • 三.数 据 链 路 层

    数据链路层是实现设备之间通信的非常重要的一层 数据链路层的作用 数据链路层使用的信道 1 使用点对点信道的数据链路层 1 1 数据链路和帧 链路 link 是一条无源的点到点的物理线路段 中间没有任何其他的交换结点 一条链路只是一条通路的一
  • 数据分析之-pandas

    1 pandas库安装导入 windows下和linux下都可以使用pip安装 安装之前最好把pip升级到最新版 python m pip install upgrade pip 升级pip pip install pandas 安装pan
  • myabtis-plus 代码生成器自定义模板

    mybatis plus代码生成器默认生成的controller是下面这样的 一个空的controller RestController RequestMapping sysUserRoleRelevance public class Sy
  • JavaScript中浮点数精确值问题

    js中规定安全整数的范围是 2的53次方至2的53次方 也就是 9007199254740992 9007199254740992 在JavaScript中0 1 0 2不等于0 3的问题 0 1 0 2 0 300000000000000