Python:2.2*3.0 = 6.6000000000000005

Sam*_*sov -4 python multiplication floating-point-precision

我的问题更多是关于为什么在C++,C#和VB中

std::cout<<2.2f*3.0f<<std::endl; //prints 6.6
Run Code Online (Sandbox Code Playgroud)

在Python,Java和Ruby中

2.2*3.0 //prints 6.6000000000000005
Run Code Online (Sandbox Code Playgroud)

我对内存中的浮点表示非常熟悉.我检查过,事实上2.2无法用单精度精确表示在内存中.

但是为什么C++,C#和VB在打印值时会切断结果中不相关的部分而其他部分却没有?

rlm*_*lms 6

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

想象一下,试图在基数10中将1/3精确地写为十进制 - 你不能因为你没有无限的时间或纸张.有无穷多的3,所以任何十进制表示只能是近似值.

类似地,计算机没有无限量的内存,因此它们不能准确地表示某些分数(尽管这些是计算机在基数2中工作的不同分数).所以在这种情况下,最近的计算机可以达到2.2*3.0是6.6000000000000005.这与乘法无关,因为计算机无法完全准确地存储2.2.但是,大多数情况下,给出的准确度足够接近.

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

关于这导致"精确业务逻辑"的问题,答案通常是在处理金钱时,不要将1.23英镑编码为1.23,而是编码为123(便士).但是,在处理分配金额时,您可能需要做一些更复杂的事情,但这不应该只是使用浮点数.

在回答您编辑的问题时,只是C++没有显示与Python一样多的数字.它不能更准确地存储它.

"但是为什么C++,C#和VB在打印价值时切断了结果中不相关的部分,而其他人没有?"

因为他们这样做.实施这些语言的人对实施其他语言的人做出了不同的选择.他们权衡了完全打印它的好处(这意味着你不要忘记浮点运算是不准确的)有缺点(有时候更难看出有效结果是什么,缩短它会得到准确的结果)时间)并得出不同的结论.