Python:2.2*3.0=6.600000000000005

2024-09-28 20:55:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题更多的是关于 在C++、C语言和VB

std::cout<<2.2f*3.0f<<std::endl; //prints 6.6

在Python、Java和Ruby中

^{pr2}$

我对内存中的浮点表示非常熟悉。 我检查过,实际上2.2不能在内存中以单一精度精确表示。在

<>但是为什么C++、C和VB在打印值时删去不相关的部分而其他的则不呢?在


Tags: 内存精度javaprints浮点stdrubyvb
1条回答
网友
1楼 · 发布于 2024-09-28 20:55:04

这与Python无关,它只是计算机处理浮点运算的方式。在

试想一下,试图精确地写下1/3的十进制数,以10为基数-你不能,因为你没有无限的时间和纸张。3的数目是无限的,所以任何十进制表示法都只能是近似值。在

类似地,计算机没有无限量的内存,所以它们不能精确地表示某些分数(尽管这些分数是不同的,因为计算机是以2为基数工作的)。所以在这个例子中,计算机能达到2.2*3.0的最近值是6.600000000000005。这与乘法无关,因为计算机不能完全准确地存储2.2。然而,最接近的准确度已经足够了。在

如果您需要Python中完美的准确性,可以使用Decimal模块。在

关于这在“精确商业逻辑”中引起的问题,答案通常是,在处理金钱时,不要将1.23英镑编码为1.23英镑,而是将其编码为123英镑(便士)。然而,在处理金额分配时,您可能需要做一些更复杂的事情,但这不应该只是使用浮动。在

在回答你编辑的问题时,C++只是没有显示与Python相同的数字。它不能更准确地存储它。在

<>但是为什么C++、C和VB在打印值时会删去不相关的部分,而其他的则不呢?在

因为他们有。实现这些语言的人与实现其他语言的人做出了不同的选择。他们权衡了完全打印出来的好处(这意味着你不会忘记浮点运算是不准确的)和缺点(有时更难看到有效的结果,缩短它会在很大程度上给出准确的结果),并得出了不同的结论。在

相关问题 更多 >