热门标签 | 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()方法!

推荐阅读
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • This guide provides a comprehensive step-by-step approach to successfully installing the MongoDB PHP driver on XAMPP for macOS, ensuring a smooth and efficient setup process. ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 深入理解Java中的volatile、内存屏障与CPU指令
    本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ... [详细]
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社区 版权所有