JS: 0.1+0.2会等于0.30000000004
注:下面为早期学习记录未注明原作者,找到时补上。
JavaScript的number类型按照ECMA的JavaScript标准,它的Number类型就是IEEE 754的双精度数值,相当于java的double类型。IEEE 754标准《二进制浮点数算法》(www.ieee.org)就是一个对实数进行计算机编码的标准。因此精度问题不止JS这门语言独有。
无论是用纸张记录数值,还是用计算机记录数值,都必须用某种编码方案来表达数值。必须理解的是,用编码表达的数值不是数值本身,而只是数值的一种人类或计算机可理解的描述。任何编码方案都有其局限,要么是表达范围(精度)方面的限制,要么是其他复杂性方面的制约。
绝对完美的数值编码方案是不存在的,为了处理方便,这个标准引入了大量的折衷和妥协,建立在这种表达方式上的算法(例如除法运算)也一样。由于数值表达方式存在“缺陷”,运算结果不可避免地堆聚起越来越多的误差。
按IEEE 754格式保存的浮点数精度相当于带有15、16或17位小数位数的十进制小数,由于存在二进制和十进制的转换问题,具体的位数会发生变化。要获得最高的转换精度,必须指定17位的小数——此时可以相信前15位的精度。
在JavaScript中输出下面这些数值(注意不能作为字符串输出):0.1000000000000000000000000001(28位小数)、0.100000000000000000000000001(27位小数)、0.1000000000000000000000000456(28位小数)、0.09999999999999999999999(23位小数),显示出来的结果都是数值0.1。又如,如果输出1/3的有理数表达式,结果是0.3333333333333333。
因此JavaScript小数在做四则运算时,精度会丢失。
当然也有一些方法可以来保证一定的精度:http://jiangzhengjun.iteye.com/blog/4...
也有人总结了一些原则:
原则
■ 大多数Web页面不需要小数 避免使用小数,尽量设法使用整数。确保数组的索引都是整数。按分(而不是元)计算金额。百分比放大100倍计算以避免出现小数。尽可能不用除法(/)和模(%)运算,因为大多数情况下它们直接导致出现浮点数。如果必须使用除法,立即用Math.round方法回归整数运算。
■ 如果必须使用浮点数,则尽可能引入冗余小数位——即在程序要求的运算精度之外,再增加小数位 如果程序需要5位数字的小数精度,则在运算中至少保留6位的小数,8位更好。冗余位越多,累计误差的影响越小。
■ 避免在同一个表达式中使用相差太大或太小的数值 对两个非常接近的数值执行减法或比较操作很容易出错。将很小的数值和很大数值相加无异于浪费时间,小的数值很可能被当作0。不过,很小的数值乘以很大的数值一般不会出现问题,例如2 * 12345678会得到正确的结果24691356。但是,0.1 - 0.09的结果是0.010000000000000009。
■ 用isFinite()和isNaN()检查运算结果 通过表单提交任何数值运算结果之前,一定要先检查数据的合法性。
■ 慎用数值运算 程序涉及的数值运算越少,引入误差的可能就越小。视浮点数为贵客,不可任意驱使。
(原网页https://segmentfault.com/q/1010000000137297)
注:下面为早期学习记录未注明原作者,找到时补上。
JavaScript的number类型按照ECMA的JavaScript标准,它的Number类型就是IEEE 754的双精度数值,相当于java的double类型。IEEE 754标准《二进制浮点数算法》(www.ieee.org)就是一个对实数进行计算机编码的标准。因此精度问题不止JS这门语言独有。
无论是用纸张记录数值,还是用计算机记录数值,都必须用某种编码方案来表达数值。必须理解的是,用编码表达的数值不是数值本身,而只是数值的一种人类或计算机可理解的描述。任何编码方案都有其局限,要么是表达范围(精度)方面的限制,要么是其他复杂性方面的制约。
绝对完美的数值编码方案是不存在的,为了处理方便,这个标准引入了大量的折衷和妥协,建立在这种表达方式上的算法(例如除法运算)也一样。由于数值表达方式存在“缺陷”,运算结果不可避免地堆聚起越来越多的误差。
按IEEE 754格式保存的浮点数精度相当于带有15、16或17位小数位数的十进制小数,由于存在二进制和十进制的转换问题,具体的位数会发生变化。要获得最高的转换精度,必须指定17位的小数——此时可以相信前15位的精度。
在JavaScript中输出下面这些数值(注意不能作为字符串输出):0.1000000000000000000000000001(28位小数)、0.100000000000000000000000001(27位小数)、0.1000000000000000000000000456(28位小数)、0.09999999999999999999999(23位小数),显示出来的结果都是数值0.1。又如,如果输出1/3的有理数表达式,结果是0.3333333333333333。
因此JavaScript小数在做四则运算时,精度会丢失。
当然也有一些方法可以来保证一定的精度:http://jiangzhengjun.iteye.com/blog/4...
也有人总结了一些原则:
原则
■ 大多数Web页面不需要小数 避免使用小数,尽量设法使用整数。确保数组的索引都是整数。按分(而不是元)计算金额。百分比放大100倍计算以避免出现小数。尽可能不用除法(/)和模(%)运算,因为大多数情况下它们直接导致出现浮点数。如果必须使用除法,立即用Math.round方法回归整数运算。
■ 如果必须使用浮点数,则尽可能引入冗余小数位——即在程序要求的运算精度之外,再增加小数位 如果程序需要5位数字的小数精度,则在运算中至少保留6位的小数,8位更好。冗余位越多,累计误差的影响越小。
■ 避免在同一个表达式中使用相差太大或太小的数值 对两个非常接近的数值执行减法或比较操作很容易出错。将很小的数值和很大数值相加无异于浪费时间,小的数值很可能被当作0。不过,很小的数值乘以很大的数值一般不会出现问题,例如2 * 12345678会得到正确的结果24691356。但是,0.1 - 0.09的结果是0.010000000000000009。
■ 用isFinite()和isNaN()检查运算结果 通过表单提交任何数值运算结果之前,一定要先检查数据的合法性。
■ 慎用数值运算 程序涉及的数值运算越少,引入误差的可能就越小。视浮点数为贵客,不可任意驱使。
(原网页https://segmentfault.com/q/1010000000137297)
发表评论
-
linux将80端口映射到8080
2017-11-28 17:06 524iptables -t nat -A PREROUTING ... -
eclipse黑科技
2017-10-12 10:46 524eclipse的黑科技 -
linux启动jetty系统环境变量不生效
2017-09-11 20:40 917netstat -nalp | grep 8080 kill ... -
前端调后端跨域问题
2017-08-14 23:59 5011:使用Filter package xx ... -
IFRAME跨域单点登录问题
2017-07-21 15:13 1461iframe里面src指向了一个跨域的url,www.a.co ... -
JS BASE64
2017-07-21 15:02 451var keyStr = "ABCDEFGHIJK ... -
springboot 打war包的问题
2017-07-07 19:04 4571.首先 修改pom.xml下的打包方式 <packa ... -
flex布局
2017-06-27 20:24 430要实现如下简单效果 使用传统布局: .sa-fo ... -
PosgreSQL
2017-06-12 13:31 622sudo-s(root进入文件夹) export PGD ... -
spring boot idea 启动异常
2017-06-05 15:27 1012org.springframework.context.App ... -
JS与,或运算DEMO
2017-04-13 16:36 460var a = 0x1; var b = 0x2; v ... -
JS位预算符
2017-04-04 13:51 596详见博客http://www.w3school.com.cn/ ... -
未安装oracle数据库,配置plsqldeveloper
2017-04-01 13:36 517本地没装oracle数据库,但是又想用plsqldevelop ... -
maven命令行创建JMH工程的方式
2017-03-30 13:46 664新建工程 mvn archetype:generate -Di ... -
《将博客搬至CSDN》
2017-03-28 16:29 10本人同意搬家至CSDN, -
坐标轴范围及刻度的自适应算法
2017-03-24 10:14 1761本文参考博客:http://blog.csdn.net/h ... -
坐标轴范围及刻度的自适应算法
2017-03-24 10:13 0本文参考博客:http://blog.csdn.net/he ... -
apache commons pool2: ObjectPool类族实现分析
2017-03-17 09:56 701http://shmilyaw-hotmail-com.i ... -
cron表达式实现java调度任务
2017-03-17 09:34 534CronExpression cronExpression ... -
html空格符
2017-03-08 09:47 789html空格符
相关推荐
JS小数加减乘除运算后小数点后产生多位数和计算精度损失的解决方案
在使用JavaScript进行小数运算时,特别是加、减、乘、除四种基本运算,经常会遇到结果出现过多的小数位数问题。具体来说,当两个小数进行运算时,结果往往不是精确值,而是由于浮点数精度问题或者二进制转换所导致的...
JS 中小数运算(加、减、乘、除)的问题是指在JavaScript中对小数进行加、减、乘、除运算时可能遇到的精度问题。这种问题的产生是由于计算机对浮点数的存储方式和精度的限制。浮点数在计算机中是以二进制形式存储的...
在JavaScript编程语言中,计算精度问题是一个...如果压缩包中的"js-float-accuracy-master"库提供了实用的解决方案,那么它可能包含了一些优化的算法或工具,以帮助开发者更好地处理JavaScript中的浮点数计算精度问题。
解决JS浮点数(小数)计算加减乘除的BUG
在进行JavaScript小数运算时,我们经常会遇到由于浮点数表示的限制而导致的精度问题。由于浮点数在计算机内部是以二进制形式表示的,部分十进制小数无法转换成一个精确的二进制小数,这导致了在运算过程中出现误差。...
由于JavaScript内部使用的是IEEE 754标准来存储和处理浮点数,这可能导致在进行小数运算时出现精度丢失问题,尤其是在涉及大数字或者循环计算时。本篇将深入探讨这个问题,并提供一些解决方案。 首先,我们来理解...
javascript浮点数加法运算精确计算方法,能够有效避免无限循环小数的产生
在javascript中,当你使用小数进行加减乘除运算时,你会发现,所得到的结果有时后面带有长长的一段小数,使运算变得复杂,并且影响计算结果。上网查询了一下原因,大致如下:在javascript中,带小数的数据运算时总会...
这就是所谓的JavaScript小数精度丢失问题。 针对这一问题,文章提出了几种解决方法,包括乘法、加法、减法运算中对精度进行控制的函数。 在进行乘法运算时,可以通过累加两个乘数的小数位数来重新计算乘积,并最终...
JavaScript使用IEEE 754标准的64位浮点格式来表示数值,这种格式可以很好地处理大多数数值运算,但仍然存在一些精度损失的问题,尤其是在进行加减法时尤为明显。 ### 三、实现保留小数位数的函数 为了更灵活地控制...
在JavaScript开发中,处理小数加减乘除运算时经常会遇到精度丢失的问题。由于JavaScript中的数字是以IEEE 754标准的双精度64位浮点数来表示的,这就意味着它可以精确地表示的整数范围大约在-***到***之间。当超出这...
在JavaScript中,由于其数值类型(`Number`)的实现方式,小数加法时常会出现精度问题。这是因为在计算机内部,浮点数是以二进制形式存储的,而某些十进制小数无法精确地转换为二进制,导致计算过程中出现误差。这种...
### JavaScript保留两位小数的方法详解 在日常的前端开发工作中,我们经常需要处理数值运算,尤其是在涉及财务计算或展示精确度较高的数据时,对数值进行格式化处理是必不可少的一个环节。其中,一个常见的需求就是...
JavaScript无法正确处理小数运算的问题,其实...总之,小数在计算机中的二进制表示的局限性是导致JavaScript和其它语言中出现小数运算问题的根本原因。理解这一原理对于编写能够准确处理数值运算的程序是非常重要的。
4. **使用库或数据类型**:有一些JavaScript库,如`decimal.js`或`big.js`,提供了专门处理高精度计算的数据类型和操作,它们可以确保在进行浮点运算时得到完全精确的结果。 5. **四舍五入或截断**:在显示结果时,...