-4

My question is more about Why in C++,C# and VB

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

And in Python, Java and Ruby

2.2*3.0 //prints 6.6000000000000005

I'm very familiar with floating point representation in memory. I checked that in fact 2.2 cannot be represented precisely in memory with single precision.

But still why do C++,C# and VB cut-out the irrelevant part of the result when printing the value while the others do not?

4

1 回答 1

6

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

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

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

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

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

在回答您编辑的问题时,只是 C++ 显示的数字不如 Python 多。它不会更准确地存储它。

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

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

于 2013-10-17T17:42:48.793 回答