整数和浮点数相加的奇怪问题

问题描述 投票:0回答:1

有人可以向我解释一下吗?

我正在编写一个def(程序)以将文本转换为数字,并想确保它是否只是int,表示形式是int,以及如果是float,则是float。如果混合使用,则默认为浮点型。对总和进行测试会产生一些有趣的事情。当我进行更多测试时,它仍然变得陌生。

如果这始终是另一种方式,也许我可以解决,但据我所知这是不一致的。我听说这是一个问题,并且有一些库可以解决所需的状态(十进制类型),但是为什么会这样呢?这种事让我担心。我可以做?

以下示例的范围从“是,这很有意义”到“嗯?”到“如何在???”。而且这些发生在紧密接近的数字内。我的意思是,当它是5.8对6.8时,您会在结果中得到该增量。 WT ???

TIA以获得任何见解。我确定这是某处的旧消息:)

全部从提示符处运行,尽管从代码上是相同的。使用Python 3.8.2一些例子:

-2 + 4.5 => 2.5“是的,这很有意义”

-6.8 + 8 => 1.2000000000000002“嗯?”

-2 + 3.8 => 1.7999999999999998“如何在???”]

-5.8 + 8 => 2.2

-7.8 + 8 => 0.20000000000000018

-8.8 + 8 => -0.8000000000000007

-4.8 + 8 => 3.2

-4-3.8 + 8 => 0.20000000000000018

-4 + 3.8 => -0.20000000000000018

-3 + 3.8 => 0.7999999999999998

-1 + 3.8 => 2.8

types floating-point int
1个回答
0
投票

当−6.8转换为IEEE-754 64位二进制浮点格式时,它无法表示,因此将产生最接近的可表示值。该值为-6.CCCCCCCCCCCCCCC 16。当添加8时,结果为1.3333333333334 16。以十进制表示,即1.20000000000000017763568394002504646778106689453125。某些软件显示为1.2000000000000002。

注意,将1.2转换为这种格式时,结果为1.3333333333333 16,而不是1.3333333333334 16。这与-6.8 + 8不同,因为对于-6.8,舍入必须在2 -50位位置进行,因为表示-6.8要求这些位以2 2位置开头,并且有效位数有53位(浮点表示形式的一部分,代表数字的“分数”部分)。使用1.2时,第一位在2 0位置,并且舍入在2 -52位置。因此,将1.2转换为浮点格式所产生的结果比-6.8 + 8更接近1.2。

当显示浮点数时,某些软件会为其默认格式生成与唯一区分浮点数与其相邻可表示值所需的十进制数字一样的数。将1.2转换为1.3333333333333 16然后格式化为十进制格式时,将生成“ 1.2”,因为它唯一地区分了1.3333333333333333 16。但是,当格式化1.3333333333334 16时,必须产生“ 1.2000000000000002”以将其与1.3333333333333333 16区分开。

您的其他示例相似。在−5.8 + 8之类的情况下,四舍五入可以得出与直接转换2.2相同的结果,因此输出为“ 2.2”。在其他情况下,四舍五入的结果有些不同,您将获得不同的输出。

© www.soinside.com 2019 - 2024. All rights reserved.