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

推荐阅读
  • 本文详细介绍了跨站脚本攻击(XSS)的基本概念、工作原理,并通过实际案例演示如何构建XSS漏洞的测试环境,以及探讨了XSS攻击的不同形式和防御策略。 ... [详细]
  • 探索OpenWrt中的LuCI框架
    本文深入探讨了OpenWrt系统中轻量级HTTP服务器uhttpd的工作原理及其配置,重点介绍了LuCI界面的实现机制。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 使用jQuery与百度地图API实现地址转经纬度功能
    本文详细介绍了如何利用jQuery和百度地图API将地址转换为经纬度,包括申请API密钥、页面构建及核心代码实现。 ... [详细]
  • 本文探讨了Android系统中联系人数据库的设计,特别是AbstractContactsProvider类的作用与实现。文章提供了对源代码的详细分析,并解释了该类如何支持跨数据库操作及事务处理。源代码可从官方Android网站下载。 ... [详细]
  • 本文探讨了在不同场景下如何高效且安全地存储Token,包括使用定时器刷新、数据库存储等方法,并针对个人开发者与第三方服务平台的不同需求提供了具体建议。 ... [详细]
  • Web开发实践:创建连连看小游戏
    本文详细介绍了如何在Web环境中开发一款连连看小游戏,适合初学者和技术爱好者参考。通过本文,您将了解游戏的基本结构、连线算法以及实现方法。 ... [详细]
  • 使用 Babylon.js 实现地球模型与切片地图交互(第三部分)
    本文继续探讨在上一章节中构建的地球模型基础上,如何通过自定义的 `CameraEarthWheelControl` 类来实现更精细的地图缩放控制。我们将深入解析该类的实现细节,并展示其在实际项目中的应用。 ... [详细]
  • 本文探讨了在Eclipse中进行JavaScript验证时遇到的时间过长问题,并提供了解决方法。特别是对于使用ExtJS框架的用户,这一问题尤为突出。文章详细介绍了如何通过修改项目配置文件来有效解决这一问题。 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 我在尝试将组合框转换为具有自动完成功能时遇到了一个问题,即页面上的列表框也被转换成了自动完成下拉框,而不是保持原有的多选列表框形式。 ... [详细]
  • 本文探讨了Java编程语言中常用的两个比较操作符==和equals方法的区别及其应用场景。通过具体示例分析,帮助开发者更好地理解和使用这两个概念,特别是在处理基本数据类型和引用数据类型的比较时。 ... [详细]
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • 探索网页编辑的秘密武器:一行代码轻松修改网页
    通过在浏览器地址栏输入特定的JavaScript代码,用户能够即时将任何网页转换为可编辑模式,实现对页面内容的自由修改,如同使用文字处理软件一般便捷。这项技术不仅简化了网页内容的复制与修改过程,还为网页开发者提供了测试和学习的新途径。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
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社区 版权所有