js 计算浮点数

摘要:
事实上,对于浮点数的四种运算,几乎所有的编程语言都有类似的精度误差问题,但其他语言中也有打包方法来避免精度问题。Js是一种弱类型语言,从设计思想上看,对于浮点数没有严格的数据类型,因此精度误差问题尤为突出。
JS的浮点计算
最近遇到了数值计算的时候,计算结果出现了类似于199.9999999999999999999的情况,但是被用来计算的两个数值都只是两位数

就像这样      --------》         0.1 + 0.2 = 0.30000000000000004。

其实对于浮点数的四则运算,几乎所有的编程语言都会有类似精度误差的问题,只不过在其他语言中已经有封装好的方法来避免精度的问题,而 Js 是一门弱类型的语言,从设计思想上就没有对浮点数有个严格的数据类型,所以精度误差的问题就显得格外突出。下面就分析下为什么会有这个精度误差,以及怎样修复这个误差。

首先,我们站在计算机的角度去思考问题,0.1 + 0.2 这个看似简单的问题,众所周知,能被计算机读懂的是二进制,而不是我们经常看见的十进制,所以我们先把0.1 + 0.2转换为十进制,

0.1 => 0.0001 1001 1001 1001…(无限循环)

0.2 => 0.0011 0011 0011 0011…(无限循环)

双精度浮点数的小数部分最多支持 52 位,所以两者相加之后得到这么一串 0.0100110011001100110011001100110011001100110011001100 因浮点数小数位的限制而截断的二进制数字,这时候,我们再把它转换为十进制,就成了 0.30000000000000004。

所以计算机在计算的时候,会先把数值转换为二进制,然后在进行相加,得到的二进制结果,在转化为十进制,这个时候结果就会变成后面多了很多位数的数字;

这个时候就会得到解决方案:将每个浮点数乘以10的N次方,计算完成后再除以10的N次方;

在网上找了一个封装的方法来进行转化(如下)

countFloat(E,S)

let n = Math.pow(10, S);

let res = Math.round(E * n) / n;

return res;

}

注释:E是计算表达式,S是需要乘以10的多少次方

所以     0.1 + 0.2    应该是:

countFloat(0.1+0.2,2);

最后的返回值是0.3

免责声明:文章转载自《js 计算浮点数》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MATLAB2017 下载及安装教程TCP协议粘包问题详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

对require.js 的使用进行总结

一、为什么要使用require.js       首先一个页面如果在加载多个js文件的时候,浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长;其次,由于js文件之间存在依赖关系,因此必须严格保证加载顺序,当依赖关系很复杂的时候,代码的编写和维护都会变得困难。       require.js,就是为了解决这两个问题:       (1)实现...

js获取mac地址(续)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><...

Delphi中的操作二进制文件的两个重要函数

Delphi中的操作二进制文件的两个重要函数 对于通过Byte数组进行文件操作的,在FTP中经常会使用到,我也是在Delphi调用Web Service进行文件的上传和下载时找到这两个函数的,挺好用的,推荐给大家。(申明:非本人所写) 1. 将Byte数组生成文件 procedureByteArrayToFile(constByteArray : TB...

nodejs使用pkg打包

Node.js应用不需要经过编译过程,可以直接把源代码拷贝到部署机上执行,确实比C++、Java这类编译型应用部署方便。然而,Node.js应用执行需要有运行环境,意味着你需要先在部署机器上安装Node.js。虽说没有麻烦到哪里去,但毕竟多了一个步骤,特别是对于离线环境下的部署机,麻烦程度还要上升一级。假设你用Node.js写一些小的桌面级工具软件,部署到...

JS 百度地图路书---动态路线

JS 百度地图路书---动态路线 <!DOCTYPE html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="initial-s...

JS中常用的xpath特性

//选择所有dir元素的值等于xx的元素    Dom.documentElement.selectNodes("server/dir[text()='xx']")       //选择server元素下的所有dir元素:    Dom.documentElement.selectNodes("server/dir")       //选择server元素...