首页 > 其他分享 >0.1 + 0.2、0.1 + 0.3和0.1 * 0.2分别等于多少?并解释下为什么?

0.1 + 0.2、0.1 + 0.3和0.1 * 0.2分别等于多少?并解释下为什么?

时间:2024-11-21 12:35:13浏览次数:1  
标签:舍入 0.1 0.3 0.2 计算 浮点数

  • 0.1 + 0.2: 结果是 0.30000000000000004. 这是因为在 JavaScript (以及许多其他编程语言) 中,数字是用浮点数表示的,更具体地说是双精度浮点数,遵循 IEEE 754 标准。 这个标准使用二进制来表示数字,而 0.1 和 0.2 无法用二进制精确表示,就像 1/3 无法用十进制有限位数精确表示一样。因此,在进行计算时会产生微小的舍入误差,导致结果略微偏离预期的 0.3。

  • 0.1 + 0.3: 结果是 0.4. 虽然 0.1 和 0.3 也不能用二进制精确表示,但在这个特定的情况下,累积的舍入误差恰好导致最终结果与我们预期的十进制值相同。这只是一个巧合,不代表所有涉及 0.1 或 0.3 的计算都会得到精确的结果。

  • 0.1 * 0.2: 结果是 0.020000000000000004. 与加法类似,乘法也涉及浮点数,因此也会受到舍入误差的影响。0.1 和 0.2 的二进制表示的乘积在转换为十进制时会产生一个非常接近 0.02 但略有不同的值。

在前端开发中,处理浮点数时需要注意这些舍入误差,尤其是在进行比较或需要高精度计算时。可以使用一些技巧来减轻这些问题的影响,例如:

  • 使用toFixed()方法进行舍入: 可以将结果舍入到指定的精度,例如 (0.1 + 0.2).toFixed(1) 会返回字符串 "0.3"。需要注意的是,toFixed() 返回的是字符串,而不是数字。

  • 将数字转换为整数进行计算: 如果可能的话,可以将数字乘以一个合适的倍数,将其转换为整数进行计算,然后再将结果除以相同的倍数。例如,计算 0.1 + 0.2 可以转换为 (1 + 2) / 10。

  • 使用专门的库: 一些库,例如 decimal.js,提供了更精确的十进制计算,可以避免浮点数舍入误差带来的问题。 这在处理金融或其他需要高精度计算的场景中尤其有用。

总之,理解浮点数的局限性对于前端开发至关重要,可以避免一些潜在的错误和精度问题。

标签:舍入,0.1,0.3,0.2,计算,浮点数
From: https://www.cnblogs.com/ai888/p/18560427

相关文章

  • 从2s优化到0.1s
    前言分类树查询功能,在各个业务系统中可以说随处可见,特别是在电商系统中。 但就是这样一个简单的分类树查询功能,我们却优化了5次。到底是怎么回事呢?背景我们的网站使用了SpringBoot推荐的模板引擎:Thymeleaf,进行动态渲染。它是一个XML/XHTML/HTML5模板引擎,可用于Web与非Web......
  • Win10 部署 Langchain-Chatchat 0.3
    项目地址:https://github.com/chatchat-space/Langchain-Chatchat前面装好了Xinference现在开始安装Langchain-Chatchat我们还是要先conda创建个环境condacreate --prefixD:\AI\Chatchat03python=3.11下面激活环境:condaactivateD:\AI\Chatchat03然后安装Langchain-Cha......
  • git 报错 Connection reset by 20.205.243.160 port 22 解决
    在某天愉快地拉取代码时突然发现拉不了了:$gitpullkex_exchange_identification:read:ConnectionresetbypeerConnectionresetby20.205.243.160port22fatal:Couldnotreadfromremoterepository.Pleasemakesureyouhavethecorrectaccessrightsandthe......
  • 10.1 基于深度学习的目标检测
    首次完成时间:2024年 11月20日1. 使用OpenCV的dnn模块实现图像分类。1)程序代码:importnumpyasnpimportcv2#解析标签文件row=open("model1/synset_words.txt").read().strip().split("\n")class_label=[r[r.find(""):].split(",")[0]forri......
  • 10.25
    中介者模式下面是一个简单的示例,展示了如何在Java中实现中介者模式://中介者接口interfaceMediator{voidsendMessage(Stringmessage,Colleaguecolleague);}//抽象同事类abstractclassColleague{protectedMediatormediator;publicColleague(......
  • 10.24
    迭代器模式下面是一个简单的示例,展示了如何在Java中实现迭代器模式://迭代器接口interfaceIterator{booleanhasNext();Objectnext();}//集合接口interfaceCollection{IteratorcreateIterator();}//具体迭代器classConcreteIteratorimpleme......
  • 10.11
    原型模式//抽象原型类abstractclassPrototypeimplementsCloneable{publicabstractPrototypeclone();}//具体原型类classConcretePrototypeextendsPrototype{privateStringattribute;publicConcretePrototype(Stringattribute){......
  • 10.10
    构建者模式下面是一个简单的Java代码展示示例,展示了构建者模型的现实://产品类classProduct{privateStringpart1;privateStringpart2;privateStringpart3;publicvoidsetPart1(Stringpart1){this.part1=part1;}publicv......
  • 10.14
    过滤器模式下面是一个简单的Java代码展示示例,展示了经过滤器模型的现实:importjava.util.ArrayList;importjava.util.List;//实体类classProduct{privateStringname;privateStringcategory;publicProduct(Stringname,Stringcategory){......
  • 10.13
    桥接模式桥接模型(BridgePattern)是一种结构设计模型,先在将抽像部分和实际部分解析成,使它们可以独立地改变。桥接模型通通过使用组合关系而不是继承关系,将两个单独立变的维数分离开来,从而提高系统的灵性和可扩展性。在桥接口模式中,抽像部分和实际部分分别由两个抽像类(或接口)确定......