【问题标题】:Float value behaviour in Python 2.6 and Python 2.7Python 2.6 和 Python 2.7 中的浮点值行为
【发布时间】:2017-02-15 09:51:06
【问题描述】:

我必须将字符串转换为浮点元组。 在 Python 2.7 中,它给出了正确的转换,但在 Python 中,情况不同。

我希望在 Python 2.6 中具有相同的行为

谁能帮助我为什么这在 Python 2.6 中不一样以及如何在 Python 2.6 中做。

Python 2.6

>>> a
'60.000,494.100,361.600,553.494'
>>> eval(a)
(60.0, 494.10000000000002, 361.60000000000002, 553.49400000000003)
>>> import ast
>>> ast.literal_eval(a)
(60.0, 494.10000000000002, 361.60000000000002, 553.49400000000003)
>>> 

>>> for i in a.split(","):
...   float(i)
... 
60.0
494.10000000000002
361.60000000000002
553.49400000000003
>>> 

Python 2.7

>>> a
'60.000,494.100,361.600,553.494'
>>> eval(a)
(60.0, 494.1, 361.6, 553.494)
>>> import ast
>>> ast.literal_eval(a)
(60.0, 494.1, 361.6, 553.494)
>>> 

>>> for i in a.split(","):
...   float(i)
... 
60.0
494.1
361.6
553.494

不好看

[编辑 2]

我只是打印价值和条件

print fGalleyTopRightOddX, ">=", tLinetextBbox[2], fGalleyTopRightOddX>=tLinetextBbox[2]

361.6 >= 361.6 False

我从字符串计算 tLinetextBbox 值,这是 361.60000000000002fGalleyTopRightOddX 值是 361.6

我正在开发 Python Django 项目,其中 apache 是服务器。

  1. fGalleyTopRightOddX361.6 是在apache环境下计算的
  2. tLinetextBbox361.60000000000002 在 cmd 上计算意味着我将 fGalleyTopRightOddX 传递给由命令 line os.system 运行的程序

[编辑 3] 再多一点信息,

当我在文本文件中记录字典时,我得到 tLinetextBbox vale 为 361.59999999999997

【问题讨论】:

  • 在这两种情况下,您都得到了正确的值,只是 Python 2.7 improved how floating point numbers are displayed。 (提示“每个计算机科学家都应该知道的关于浮点数的知识”链接)
  • @kennytm 也许更好的说法是,在这两种情况下,你得到了相同的 incorrect 值。
  • @kennytm 和 Johan:谢谢,但我仍然得到错误的答案。我更新了问题,你能再看看吗?

标签: python python-2.7 floating-point python-2.6


【解决方案1】:

为了在 Python 2.6 中获得相同的结果,您必须明确地这样做:

'%.12g' % float_variable

最好创建一个自定义函数来执行此操作:

def convert_to_my_float(float_value):
    return float('%.12g' % float_value)

根据Python's Decimal Objects文档:

在 2.6 版中更改:前导和尾随空白字符是 从字符串创建 Decimal 实例时允许。

在 2.7 版更改:构造函数的参数现在是 允许为浮点实例。

为什么它们的行为不同?的答案是,因为 Python 2.7 中的 float.__repr__()float.__str__() 方法发生了变化。

【讨论】:

  • 谢谢,但我仍然得到错误的答案。我更新了问题,你能再看看吗?
  • 我想我仍然没有遇到您的问题。为什么不从os 命令计算tLinetextBbox 的值,从我提到的函数中获取所需的值,然后将返回的值传递给您的命令
  • 您的功能不起作用,>>> convert_to_my_float(361.60000000000002) 361.60000000000002 >>> convert_to_my_float(361.6) 361.60000000000002 我在有问题的 Edit3 中添加了一些信息。你能看看吗?
  • 您遇到的错误是什么?是TypeError: float argument required, not str吗?如果是,则在传递给函数之前将其类型转换为floatfloat('361.60000000000002')
猜你喜欢
  • 2018-04-21
  • 2013-11-28
  • 2015-05-17
  • 1970-01-01
  • 2014-05-26
  • 2015-01-18
  • 1970-01-01
  • 2014-02-11
  • 2017-01-17
相关资源
最近更新 更多