Python:2.2*3.0=6.600000000000005

Python:2.2*3.0=6.600000000000005,python,multiplication,floating-point-precision,Python,Multiplication,Floating Point Precision,我的问题更多的是关于 在C++、C语言和VB 我非常熟悉内存中的浮点表示。 我检查了一下,事实上2.2不能在内存中以单精度精确表示 但是为什么C++、C和VB在打印值时会删去不相关的部分,而其他的则不存在? 这与Python无关,这只是计算机处理浮点运算的方式。 想象一下,试着把1/3写下来,精确到以10为基数的小数点——你不能,因为你没有无限的时间或纸张。3的数量是无限的,所以任何十进制表示法都只能是近似值 类似地,计算机没有无限大的内存,因此它们不能精确地表示某些分数(尽管这些分数与计算机

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

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


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

这与Python无关,这只是计算机处理浮点运算的方式。 想象一下,试着把1/3写下来,精确到以10为基数的小数点——你不能,因为你没有无限的时间或纸张。3的数量是无限的,所以任何十进制表示法都只能是近似值

类似地,计算机没有无限大的内存,因此它们不能精确地表示某些分数(尽管这些分数与计算机在base 2中工作时的分数不同)。因此,在这种情况下,计算机能够到达2.2*3.0的最近距离是6.600000000000005。这与乘法无关,因为计算机不能完全准确地存储2.2。然而,大多数时候,给出的准确度已经足够接近了

如果您需要Python的精确性,可以使用该模块

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

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

“但是,为什么C++、C和VB在打印值时删去了不相关的部分,而其他的则没有?”
因为他们有。实现这些语言的人做出了与实现其他语言的人不同的选择。他们权衡了完全打印出来的好处(这意味着你不要忘记浮点运算是不准确的)和缺点(有时更难看出有效结果是什么,缩短大部分时间会得到准确的结果)得出了不同的结论。

这是浮标固有的问题。。。它们并不精确。。。这个问题存在于几乎所有可以想象的语言中。。。尝试从十进制导入十进制;Decimal(“2.2”)*Decimal(“3.0”)尝试阅读以下内容:在谷歌上查找浮点算术。简而言之,您的计算机无法准确地表示数字6.6。这也是为什么你永远不应该做==与浮点数比较的原因。我喜欢这个问题中的链接:。在旁注中,有时它们可以存储精确的表示(如果他使用2.5而不是2.2)。我想最近涉及C#和VB的项目正是这样做的。他们让我忘记了通过四舍五入值来表示浮点是不准确的。感谢您回答原始问题和编辑,而不是说“哦,您有经验吗?”!
std::cout<<2.2f*3.0f<<std::endl; //prints 6.6
2.2*3.0 //prints 6.6000000000000005