0.1和0.2返回0.30000000000000004

2021-04-12 04:22:00

在JavaScript源文件中并执行它,JavaScript不会将0.1解释为实数0.1,因为JavaScript号码不能表示每一个可能的实数,而0.1不是它们可以表示的实数之一。相反,0.1被解释为最接近的JavaScript号码为0.1,其中二进制是数字

请注意,如果我们想要的话:

无论如何(IM)精确,javascript都将始终解释我们所写的内容,作为最接近可用的JavaScript号码。有时这种重新解释将绝对精确。但有时这种重新解释将失去一些精确度。

JavaScript不会将其解释为实际数字0.2,但作为实数

JavaScript不会将此作为实际数字0.3解释,但作为实数

(或const = x + y),javascript实际计算是准确的总和

JavaScript号码也不能表示此精确结果,因此返回的值是最接近的可用JavaScript号码,即

再次,我们已经失去了一点精确度,虽然出于不同的原因。首先,我们在解释源代码中失去了一些精确度。现在,我们在计算中失去了更多的精确度。

请注意,我们通过编写0.1 + 0.2的此总和值是我们在简单地键入0.3时所获得的不同JavaScript号码。

现在,当我们尝试在控制台上记录任何这些值时会发生什么?

JavaScript不会记录数字的每个最后十进制位置。相反,JavaScript注销唯一地标识来自它附近的其他JavaScript号码所需的最小数字数。

严格来说,Console.log(0.1)日志0.1的唯一原因是因为两个不同的精度丢失事件彼此取消。 JavaScript编程语言中没有0.1。一个人会被误认为存在。

出去。最后,如果我们尝试记录0.1 + 0.2的结果,我们记得是

所以它为什么0.1 + 0.2等于0.30000000000000004,不等于0.3。它'因为我们在三个不同的地方丢失了精度:

双重不能代表每一个可能的实数。它只能代表大约2 64个不同的实数,所有这些都是整数的电力倍数2.这包括0.125,但不是0.1。相反,我们得到上面看到的近似行为。

此行为不是JavaScript唯一的。在每个编程语言中都可以看到,其中双打,包括C,C ++,C#,Erlang,Java,Python和Rust。

现在离开这个RSS源,因为哦,我的善良我需要修复我的网站和#39的格式。这与难以辨认。

有趣的," 1 + 2 = 3"真的可以在JavaScript中精确表达。一般来说,JavaScript可以表示的所有数字都有表单(1 + [尺寸在分母中有两个的分数])*两个功率。所以你可以get1:(1 + 0)* 12:(1 + 0)* 23:(1 + 0.5)* 24:(1 + 0)* 45:(1 + 0.25)* 46:(1 + 0.5) * 47 :( 1 + 0.75)* 48:(1 + 0)* 8。从1开始,您可以精确地表达0.5,0.25,0.125,以及在它们中间的两种数字,如0.75.observe如何使用且尺寸的空间块粗糙; SA连续的2 - [1-2),[2-4),[4-8) - [4-8) - 并将其进一步分为分数段。但是,您永远无法通过该方法表达1/10。按照向后遵循序列,找到包含0.1:[0.5-1),[0.25-0.5)的块[0.25-0.25),[0.0625-0.125)是一个。换句话说,我们必须通过向分母中的两个功率添加到0.0625的一些部分来达到0.1。然而:0.1-0.0625 = 0.0375或3/80,具有素数为5的分母。换句话说,不能用统治者表达的部分,即' SA电源为2.此模式出现,因为浮点数,您的计算机用于执行非整数数学,尝试非常大而且非常有用少数。出于这个原因,他们使用从上面的两种序列中拍摄块并细分的技巧,这意味着您在1左右的精度左右获得精度,但同样的精度约为0.00001或100000.选择的数字数字行的正确块是指数,并且细分块的数字是尾数。换句话说,1和2完全在024和2048之间的浮点数完全多于1024和2048,或0.125和0.25.now你可以合理地问:"好吧,他们为什么他们为他们的块使用两个力量?如果他们使用了十个的权力,就像人类一样,经常普通的人类数字会更干净地代表。"好吧,对于一个,计算机只有在与两者的权力合作时自然而然地工作。另外,如果您在界限范围内需要可靠的数学,则应使用整数类型,如果您在任意范围内需要可靠的数学,则应使用Bignum类型,如果您在任意中需要可靠的快速数学你应该希望前世的范围导致你and#39;在地球上得到它。他们的休息时间。('十进制浮点'确实存在,它的用途是利基。最终,如果程序员鞭打了浮点数,因为他们要么不合适。他们要么不&#39 ; T CARE OVERMUCH关于准确性或想要真正快速的东西,或者两者都不需要赋予十分之一。)

我认为你可以在JavaScript的所有方式写一篇全面的研究生论文。

> (0.4 + 0.5 == 0.3 + 0.6)误认为存在分数库,没有类型类(添加新的可公共类型)或操作员重载,它们只是丑陋。

@qntm - 这是一个公平的一点。至少其他语言您可以轻松降至更高的精度。说,在C#:( 0.4m + 0.5m == 0.3m + 0.6m)== true;它' s其他一些东西js做那个' s垃圾。 (尽管为PHP型复数保留了一个特殊的地狱般的地狱)。当其他工具在手头工作更好时,似乎有很多开发人员都是一个使用它的地狱。

"我吓坏了一个人!" - 血统浮点误差和他们的积累已经是专业人士的几十年来,所以它现在可以'如果PATRIOT导弹失败是在数值计算课程中的常规教导,也是如此.Just Gotta意识到你&#39 ;使用不精确的数字,始终在您的心理数学中携带隐藏的错误变量:)

我的意思是,那种点亮的一点。' m试图制作。浮点数本身实际上始终完全精确。当你写出0.1`它而不是#39;没有" 0.1加号或减去一点"它' S *精确* 0.1000000000000000055511151231257827021181583404541015625,加上或减去0.The错误来自解析的源代码,进行计算,并打印结果。

哦,啊,抱歉,抱歉,良好的观点。它不是数字,它的转换.Readers和打印机在许多郎上骗你,并计算结果。我' ll仍然保持"错误持有者变量"对于读/写转换以及那些令人讨厌的减法和划分时,我'哈哈,哈哈,懒得调查地面真相。

在我的低精度节点。凭借GT; [ Z.Toprecision(21)' 100000000000000000000000.0'> z.toprecision(30)rangeError:toprecision()参数必须在数字介于1到21之间.Toprecision(本机)所以当您写入`100000000000000005555(&#39)时,'恰好十几千万

诚实地伤害了我一点我们'在你只是呼叫浮子和#34; JavaScript号码和#34;任何地方都没有犹豫不决。

强制性参考:"每个计算机科学家应该知道浮点数和#34; https://www.itu.dk/~sestoft/bachelor/ieee754_article.pdfhtps://docs.oracle.com/cd/e19957-01/ncg_goldberg.html(以防有人需要阅读更多内容这个问题)

在常见的LISP中,它确实,1/10 + 2/10正好3/10,但这也是因为它还具有合理的数字(与固定精度整数并行,Bignums,小浮点和较大的浮点数,可能是一些更真实类型的数字,以及这些的复杂记者).numbers基本上是复杂的,但仍然比日期时间表示更容易(如果没有别的,后者也需要有一个历法系统来说有一个感觉)。

" JavaScript号码不能代表每一个可能的实数"一些琐事:事实上,没有计算机系统可以代表每一个可能的实数。可能的计算机程序的数量是无限的,但它唯一可以是无穷无尽的,并且有许多可能的真实情况。

最详细但易于理解的javascript'谢谢!我将来指向人们的人。指出两个错误丢失的步骤,解释源并执行汇总,是写的第一款IVE。

如上所述,这是IEEE 754,您可以以多种语言查看它,例如Java。

> [Super Mario 64菜单主题]看起来像某人' S一直在看Pannenkoek解释一个视频游戏的内部细节......他有点像Mario 64的Carl Sagan:一个科学领域的普及不仅解释了事实,而且燃烧的渴望驱动他们发现的知识,无论困难还是乏味。

>一些琐事:事实上,没有电脑系统可以代表每一个可能的实数。可能的计算机程序的数量是无限的,但它唯一可以是无限的,并且有很多可能的真实。当该组的实数可以' t在计算机上表示,这组*可计算*实数可以。这个集合拥有正常的人们关心的所有实际数字。该技术称为#34;确切的真实算术"如果你喜欢了解更多自己。

但精确的1除以精确的10(是8 * 1.25)给出了什么? 0.1近似值?

是的,`1/10 === 0.1`返回`true' s再次是完全相同的数字。(10是准确的,因为它是2.整数为10的整数倍数。 2的功率为2 ^ 0 = 1.)

当人们进入一个&#34时,我总是讨厌"和#39;为什么x语言是垃圾"所有语言都是垃圾,因为他们正试图使用​​不完美的systems.heck,它&# 39; SA经常说明二元计算问题,你可以有准确性或速度,你可以' t都有两者。

我觉得实现浮点的性质是每个程序员在生活中经历的东西。在设计他们的第一个应用程序时,他们认为他们认为的钱,"好,我需要代表1.33美元,并且有一个小数点,所以我需要一个浮点"然后他们开始遇到所有这些错误,并认为他们的语言很糟糕。现实,我们通过学校或通过生活中学到的,是浮点数学在你可以使用它之前需要仔细思考,即使这样,你也可以遇到这样的问题。如果您想准确表示小数,您需要查找将帮助您执行此操作的库,或者您需要"滚动您自己的"例如,储存金钱和#39;美分'在一个Int.i' ve仍然在行业中遇到过,"我找不到红移的十进制字段,所以我一直在去年导入我们的所有点击销售进入浮田,有价值的10亿行的10亿行;

做一个物理评估,你不知道这是多少塞满了我的头脑,直到我找到这个。谢谢您的帮助!