热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么JS中,小数运算会出现多位小数?大虾们解读一下,谢谢!

今天在做制作网站的时候,发现JavaScript的一个“小问题”,就是当两位小数进行运行的时,返回“不正确”的值,得到的数后面多了许多小数位。在看网看到了一篇文章《JS小数运算出现多位小
今天在做制作网站的时候,发现 Javascript 的一个“小问题”,就是当两位小数进行运行的时,返回“不正确”的值,得到的数后面多了许多小数位。

在看网看到了一篇文章《 JS小数运算出现多位小数的解决方法》。

虽然知道了怎样解决这样的问题,但是我想知道为什么会这样,真是 Javascript 的 bug 吗?还是关于机制之类的知识?

知道的各位朋友能否给我解释一下,我想有不少朋友和我一样想知道的!

16 个解决方案

#1


小数不能精确转换成2进制导致的  java也有类似的情况  貌似

#2


引用 1 楼 zzgzzg00 的回复:
小数不能精确转换成2进制导致的  java也有类似的情况  貌似


你是指跟机器有关?所有的语言都这样吗?不会吧!

#3


参考: http://madscript.com/Javascript/javscript-float-number-compute-problem/

#4


十进制数字 8,用二进制表示为 100
可以理解为 1*2^2+0*2^1+0*2^0 = 8

那么小数部分怎么表示?
十进制数字 0.5,用二进制表示为 0.1
可以理解为 0*2^0+1*(2^-1) = 0.5

十进制数字 0.25,用二进制表示为 0.01
可以理解为 0*2^0+0*(2^-1)+1*(2^-2) = 0.25

十进制数字 0.75,用二进制表示为 0.11
可以理解为 0*2^0+1*(2^-1)+1*(2^-2) = 0.75

好了,问题来了 怎么表示一个 介于 0.25~0.5 之间的数?
除不尽吧?无理数吧?对了,这就是浮点数不是刚刚好等于一个十进制浮点数的原因

#5


肯定是培训中心出来的……

#6


该回复于2013-09-05 10:46:42被管理员删除

#7


做一下舍入吧
保留两位:
num = Math.round(num*100)/100;

#8


引用 2 楼 u010900359 的回复:
Quote: 引用 1 楼 zzgzzg00 的回复:

小数不能精确转换成2进制导致的  java也有类似的情况  貌似


你是指跟机器有关?所有的语言都这样吗?不会吧!
 java和Javascript中计算小数运算时,都会先将十进制的小数换算到对应的二进制,一部分小数并不能完整的换算为二进制,这里就出现了第一次的误差。待小数都换算为二进制后,再进行二进制间的运算,得到二进制结果。然后再将二进制结果换算为十进制,这里通常会出现第二次的误差。要避免这种情况呢,通常可以将小数同时扩大相同10的整倍数,完成计算后,在去掉之前添加的整倍数。

#9


引用 5 楼 clark_kidd 的回复:
肯定是培训中心出来的……


我?不是,小女子不才!

#10


引用 9 楼 u010900359 的回复:
Quote: 引用 5 楼 clark_kidd 的回复:

肯定是培训中心出来的……


我?不是,小女子不才!


那更不济了  哈哈

#11


引用 7 楼 wzs_xyz 的回复:
做一下舍入吧
保留两位:
num = Math.round(num*100)/100;


解决方法现在知道了,只是想知道为什么。

#12


引用 11 楼 u010900359 的回复:
Quote: 引用 7 楼 wzs_xyz 的回复:

做一下舍入吧
保留两位:
num = Math.round(num*100)/100;


解决方法现在知道了,只是想知道为什么。

这就是为什么,仔细阅读下面的内容
十进制数字 8,用二进制表示为 100
可以理解为 1*2^2+0*2^1+0*2^0 = 8

那么小数部分怎么表示?
十进制数字 0.5,用二进制表示为 0.1
可以理解为 0*2^0+1*(2^-1) = 0.5

十进制数字 0.25,用二进制表示为 0.01
可以理解为 0*2^0+0*(2^-1)+1*(2^-2) = 0.25

十进制数字 0.75,用二进制表示为 0.11
可以理解为 0*2^0+1*(2^-1)+1*(2^-2) = 0.75

好了,问题来了 怎么表示一个 介于 0.25~0.5 之间的数?
除不尽吧?无理数吧?对了,这就是浮点数不是刚刚好等于一个十进制浮点数的原因

#13


电脑的二进制 在做小数 表达 0.1 的时候实际上是一个近似数,所以有这个问题

#14


引用 3 楼 KongHuLu 的回复:
参考: http://madscript.com/Javascript/javscript-float-number-compute-problem/
大神,你要笑死我吗?十进制的8转换成二进制应该是1000才对;

#15


本身的机制造成的,我之前也经常碰到

#16


没错,是本身的机制造成的;没有为什么,因为它本身也无法解决;
虽然说是bug,但是,既然它能存活这么多年,证明它已经被世人所接受;

其实,在计算中是不会出现有错误的,你只要把最终结果进行保留小数位换算即可;
可以使用toFixed()方法!

推荐阅读
author-avatar
素人1963_497
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有