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

推荐阅读
  • 在 Angular Google Maps 中实现图片嵌入信息窗口的功能,可以通过使用 `@agm/core` 库来实现。该库提供了丰富的 API 和组件,使得开发者可以轻松地在地图上的信息窗口中嵌入图片。本文将详细介绍如何配置和使用这些组件,以实现动态加载和显示图片的功能。此外,还将探讨一些常见的问题和解决方案,帮助开发者更好地集成这一功能。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • Java 点餐系统源代码附带管理后台(免费提供)
    本项目提供了一套基于 Java 的点餐系统,包括前端小程序和后端管理平台。采用 Spring Boot 和 SSM 框架,结合 MySQL 和 Redis 数据库技术,适用于学习和二次开发。有需要源代码的开发者可以通过私信联系,免费获取下载链接。 ... [详细]
  • Python 中 json.dumps() 和 json.loads() 的使用方法详解——Python 面试与 JavaScript 面试必备知识
    在 Python 中,`json.dumps()` 和 `json.loads()` 是处理 JSON 数据的核心函数。`json.dumps()` 用于将字典或其他可序列化对象转换为 JSON 格式的字符串,而 `json.loads()` 则用于将 JSON 字符串解析为 Python 对象。本文详细介绍了这两个函数的使用方法及其在 Python 和 JavaScript 面试中的重要性,帮助读者掌握这些关键技能。 ... [详细]
  • 动态壁纸 LiveWallPaper:让您的桌面栩栩如生(第二篇)
    在本文中,我们将继续探讨如何开发动态壁纸 LiveWallPaper,使您的桌面更加生动有趣。作为 2010 年 Google 暑期大学生博客分享大赛 Android 篇的一部分,我们将详细介绍 Ed Burnette 的《Hello, Android》第三版中的相关内容,并分享一些实用的开发技巧和经验。通过本篇文章,您将了解到如何利用 Android SDK 创建引人入胜的动态壁纸,提升用户体验。 ... [详细]
  • 如何在PHP中正确配置错误显示功能
    在PHP中正确配置错误显示功能的方法如下:首先,定位并打开“php.ini”配置文件;接着,将“display_errors”参数设置为“On”;最后,在PHP代码文件的顶部添加 `ini_set('display_errors', '1');` 以确保错误信息能够被正确显示。此外,建议在开发环境中启用此功能,而在生产环境中禁用,以避免敏感信息泄露。 ... [详细]
  • 能够感知你情绪状态的智能机器人即将问世 | 科技前沿观察
    本周科技前沿报道了多项重要进展,包括美国多所高校在机器人技术和自动驾驶领域的最新研究成果,以及硅谷大型企业在智能硬件和深度学习技术上的突破性进展。特别值得一提的是,一款能够感知用户情绪状态的智能机器人即将问世,为未来的人机交互带来了全新的可能性。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • SQLite数据库CRUD操作实例分析与应用
    本文通过分析和实例演示了SQLite数据库中的CRUD(创建、读取、更新和删除)操作,详细介绍了如何在Java环境中使用Person实体类进行数据库操作。文章首先阐述了SQLite数据库的基本概念及其在移动应用开发中的重要性,然后通过具体的代码示例,逐步展示了如何实现对Person实体类的增删改查功能。此外,还讨论了常见错误及其解决方法,为开发者提供了实用的参考和指导。 ... [详细]
  • 探索偶数次幂二项式系数的求和方法及其数学意义 ... [详细]
  • 在分析 Nginx 配置不当导致的频繁重定向问题时,发现项目根路径不为空是主要原因。为避免前后端之间的反复重定向,建议在配置中增加一层路径映射。具体配置示例如下:`server { listen 80; server_name pmp.mussessein.cn; location / { root /path/to/project; try_files $uri $uri/ /index.html; } }`。通过这种方式,可以有效减少不必要的重定向,提升用户体验和系统性能。 ... [详细]
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • 设计实战 | 10个Kotlin项目深度解析:首页模块开发详解
    设计实战 | 10个Kotlin项目深度解析:首页模块开发详解 ... [详细]
  • 本文深入解析了Spring Cloud路由网关Zuul的核心功能及其典型应用场景。通过对方志朋老师教材的学习和实践,详细探讨了Zuul在微服务架构中的重要作用,包括请求路由、过滤器链管理以及服务动态扩展等关键特性。同时,结合实际案例,展示了Zuul在高并发和复杂业务场景下的应用优势,为读者提供了全面的技术参考。 ... [详细]
  • 如何在Lua中调用C语言编译的动态链接库
    本文介绍了如何在Lua中调用C语言编译的动态链接库。通过详细步骤和示例代码,帮助开发者理解和掌握这一技术。参考了《Lua编程入门》一书中的相关内容,并结合实际操作经验,提供了更加清晰和实用的指导。此外,还探讨了在不同操作系统下编译和链接Lua的方法,为跨平台开发提供了有价值的参考。 ... [详细]
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社区 版权所有