Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么应用程序引擎显示的浮点舍入结果与我的本地机器不同?_Python_Google App Engine - Fatal编程技术网

Python 为什么应用程序引擎显示的浮点舍入结果与我的本地机器不同?

Python 为什么应用程序引擎显示的浮点舍入结果与我的本地机器不同?,python,google-app-engine,Python,Google App Engine,如果您将以下内容放入,则会得到'50.49'。这个结果在2.5和2.7运行时上都是一致的 >> a = '%0.2f' % (round(float(u'50.485'), 2),) >> a '50.49' 然而,如果我把同样的东西放进本地运行Python2.7.1的MacBookPro,我会得到'50.48' >> a = '%0.2f' % (round(float(u'50.485'), 2),) >> a '50.48' 为什

如果您将以下内容放入,则会得到
'50.49'
。这个结果在2.5和2.7运行时上都是一致的

 >> a = '%0.2f' % (round(float(u'50.485'), 2),)
 >> a
'50.49'
然而,如果我把同样的东西放进本地运行Python2.7.1的MacBookPro,我会得到
'50.48'

 >> a = '%0.2f' % (round(float(u'50.485'), 2),)
 >> a
'50.48'

为什么会有这种不同?我如何在我的本地机器和App Engine的服务器之间保持一致性?

有趣的是,官方Python教程中介绍了这个主题

浮点运算:问题和限制

其他的惊喜也随之而来。比如说,如果你试着绕圈 值2.675到小数点后两位,得到

>>>
>>> round(2.675, 2)
2.67
内置round()函数的文档说明 舍入到最接近的值,舍入到远离零的位置。自从 小数点2.675正好介于2.67和2.68之间,你知道吗 这里的结果可能是(二元近似值)2.68。 不是,因为当十进制字符串2.675转换为 二进制浮点数,它再次被二进制替换 近似值,其精确值为

2.67499999999999982236431605997495353221893310546875
因为这个近似值比2.68稍微接近2.67,所以它是 四舍五入

如果你在一个你关心你的方向的情况下 中途的情况是圆的,你应该考虑使用小数。 模块。顺便说一句,十进制模块也提供了一种很好的方法 “请参阅”存储在任何特定Python浮点中的确切值

>>>
>>> from decimal import Decimal
>>> Decimal(2.675)
Decimal('2.67499999999999982236431605997495353221893310546875')
官方Python教程()中链接的一篇文章,尽管使用了FORTRAN,但正确地描述了IEEE 754的真正含义:

不同的计算机使用不同的位数来存储数据 浮点数即使使用相同的IEEE格式 存储数字时,由于 中间寄存器的大小。以提高可移植性并确保 一致的结果,我建议不要为了精确的相等性而进行比较 用FORTRAN计算实数


因此,如果您真的关心这一点,那么一定要使用内置的十进制模块(或者cdecimal模块,如果性能有问题,可以在这里使用)。

显然,Google App Engine使用“float”C类型(IEEE 754单精度),而本地Python使用“double”(IEEE 754双精度)


我怀疑CPython有一个使用“float”而不是“double”的配置开关,但还没有找到。其他答案是正确的,所以我不会对
round
函数的行为说任何话,但是如果你想得到一致的结果,你可以跳过
round
,因为你使用的是字符串格式(
'%0.2f'
)如您在示例中所示

>> a = '%0.2f' % (float(u'50.485'))
>> a
'50.48'

感谢您的帮助。round函数最初是为了与-0和0保持一致性而尝试的一部分。原始代码是“%0.2f%”(round(n,2)+0,)因此,n=-0.00和n=0.00的结果是相同的。请参阅前面的讨论。这解释了值不同的原因,Lipis和Asim Ihsan解释了如何获得一致性。您也可以使用numpy.float32。谢谢@Asmin,我在发布问题之前仔细阅读了这些文档,但没有阅读您在bot上发布的链接汤姆。