打开你的Python,输入“0.1+0.2=”,结果是什么?0.30000000000000004对吗?为什么结果不是0.3?本文作者给出了详细的解释。我们从小就知道0.1+0.2=0.3。然而,在异想天开的计算世界中,计算的工作方式大不相同。我最近开始用JavaScript编码,在阅读数据类型时,我注意到一个奇怪的行为,即0.1+0.2不等于0.3。我转向StackOverflow寻求帮助,并在那里找到了一些有用的帖子。如下所示:StackOverflow界面的图片。经过大量研究和计算,我得出的结论是这不是错误。这就是数学中的浮点运算。让我们仔细看看内部机制。问题陈述:为什么0.1+0.2=0.30000000000000004?如果您使用Java或C编写过程,则必须知道用于存储值的不同数据类型。我们将在前面的讨论中考虑两种数据类型:整数和浮点数。整数类型存储整数,而浮点类型存储小数。在此之前,先了解一个小概念:数字是如何表示的,从而实现计算?极小的数和极大的数通常用科学记数法表示,即:同理,如果用科学记数法写的一个数,小数点前有一个非零的小数,则该数是标准化的。例如,0.0005606在科学记数法中是标准化的:Significant是不包括零的有效数字,base是使用的基数——在本例中为十进制(10)。指数表示小数点需要向左或向右移动的步数。今天,有两种显示浮点数的方法:单精度和双精度。在进行浮点运算时,单精度使用32位,双精度使用64位。与许多其他编程语言不同,JavaScript没有定义不同类型的数字数据类型,而是始终遵循国际IEEE754标准将数字存储为双精度浮点数。此格式以64位存储数字,其中数字(分数)存储在0到51位,指数存储在52到62位,符号存储在63位。IEEE754双精度标准。根据IEEE754标准,我们用64位表示0.1。第一步是将十进制的0.1转换为二进制的0.1。先把0.1乘以2,然后把小数点前的数字分开,得到它们对应的二进制数。对64位重复此操作。然后按升序排列,得到尾数,按照双精度标准四舍五入到52位。尾数用科学计数法表示二进制0.1,只保留前52位:尾数部分处理后。现在我们按以下方式处理指数:这里,11表示我们要使用的64位表示中的指数位数,-4表示科学记数法中的指数。所以数字0.1的最终表示是:类似地,0.2表示为:添加两个数字得到:转换为浮点数,它变成:这就是为什么0.1+0.2=0.30000000000000004。
