Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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 使用MySQL和SQLAlchemy ORM实现高数值精度浮点运算_Python_Mysql_Orm_Sqlalchemy_Floating Accuracy - Fatal编程技术网

Python 使用MySQL和SQLAlchemy ORM实现高数值精度浮点运算

Python 使用MySQL和SQLAlchemy ORM实现高数值精度浮点运算,python,mysql,orm,sqlalchemy,floating-accuracy,Python,Mysql,Orm,Sqlalchemy,Floating Accuracy,我使用SQLAlchemy的ORM将一些数字存储在MySQL中。当我随后取它们时,它们被截断,只有6个有效数字被保存,因此我的浮点数失去了很多精度。我想有一个简单的方法来解决这个问题,但我找不到方法。例如,以下代码: import sqlalchemy as sa from sqlalchemy.pool import QueuePool import sqlalchemy.ext.declarative as sad Base = sad.declarative_base() Sess

我使用SQLAlchemy的ORM将一些数字存储在MySQL中。当我随后取它们时,它们被截断,只有6个有效数字被保存,因此我的浮点数失去了很多精度。我想有一个简单的方法来解决这个问题,但我找不到方法。例如,以下代码:

import sqlalchemy as sa
from sqlalchemy.pool import QueuePool
import sqlalchemy.ext.declarative as sad

Base    = sad.declarative_base()
Session = sa.orm.scoped_session(sa.orm.sessionmaker())

class Test(Base): 
    __tablename__   = "test"
    __table_args__  = {'mysql_engine':'InnoDB'}
    no      = sa.Column(sa.Integer, primary_key=True)
    x       = sa.Column(sa.Float)


a = 43210.123456789
b = 43210.0
print a, b, a - b

dbEngine = sa.create_engine("mysql://chore:BlockWork33!@localhost", poolclass=QueuePool, pool_size=20,  
                                 pool_timeout=180)              
Session.configure(bind=dbEngine)   
session = Session()            

dbEngine.execute("CREATE DATABASE IF NOT EXISTS test")
dbEngine.execute("USE test")  
Base.metadata.create_all(dbEngine)   

try:
    session.add_all([Test(x=a), Test(x=b)])
    session.commit()
except:
    session.rollback()
    raise

[(a,), (b,)] = session.query(Test.x).all()
print a, b, a - b
产生

43210.1234568 43210.0 0.123456788999
43210.1 43210.0 0.0999999999985
我需要一个解决方案让它产生

43210.1234568 43210.0 0.123456788999
43210.1234568 43210.0 0.123456788999

根据我们在评论中的讨论:
sa.types.Float(precision=[precision here])
而不是
sa.Float
允许您指定精度;但是,
sa.Float(精度=32)
无效。有关详细信息,请参阅。

我不确定,没有使用过sqlalchemy,但根据,我认为您应该能够指定sa.types.Float(精度=[precision here]),而不是sa.Float。@a我知道,可以。我试过了。。。至少我觉得我试过了。实际上,我尝试了sa.Float(精度=32),它没有任何变化。但是,使用sa.types.Float(精度=32),它确实可以工作。。。我想这不是没有理由的,他们的名字叫“炼金术”。如果你把它作为一个答案(而不是一个评论)的形式,我会把它作为官方答案。非常感谢。嗯,奇怪。Fun times.FWIW我正在努力使用SQLAlchemy语法。我的项目在Flask中(因此使用Flask SQLAlchemy)。为了使
float
与我的语法一致:
ColumnName=db.Column(db.float(precision='3,2'))#db是Flask操作的一部分
上面的'3,2'生成了一个
XXX.YY
的(MySQL)字段。希望这能帮助其他人,因为文档有时不像我想的那么清晰(Flask和SQLAlchemy)。你能引用文档中的内容吗?或者更具体地说,
sa.Float(Precision=32)
格式没有效果?@datamafia或其他任何人,如果你使用alembic,您在迁移过程中看到浮点精度的变化了吗?如果是这样的话,它看起来像什么?@BrianPeterson 2件事。1-,这是我的迁移
sa.Column('ProductPrice',sa.Float(precision='3,2'),nullable=True)的副本,
。2-所有alembic迁移都必须仔细检查,通常都是错误的。所以引用的行是有效的,但我可能不得不从头开始编写,就像大多数Alembic迁移一样。请随时直接联系以获取更多信息。在这个例子中,我在MySQL.IMO上,它是
(5,2)
xxx.yy