Python Cassandra 浮动精度损失

Posted

技术标签:

【中文标题】Python Cassandra 浮动精度损失【英文标题】:Python Cassandra floating precision loss 【发布时间】:2017-12-21 16:42:12 【问题描述】:

我正在 Python 和 Cassandra 之间来回发送数据。我在我的 python 程序中使用了内置的 float 类型和我的 Cassandra 表的数据类型。如果我从 python 向 Cassandra 发送一个数字 955.99,在数据库中它会显示 955.989999。当我在 python 中发送查询以返回我刚刚发送的值时,现在是955.989990234375

我了解 python 中精度损失的问题,我只是想知道 Cassandra 中是否有任何内置机制可以防止这个问题。

【问题讨论】:

【参考方案1】:

Python float 是一个 64 位 IEEE-754 double 精度二进制浮点数。在 Cassandra 中使用 double 来匹配类型。

【讨论】:

虽然这适用于某些值,但有些像 8.83 正在变成 null,尽管它与其他值具有相同的类型,知道为什么会发生这种情况吗? 啊,问题不在于价值观本身。我使用DROP 删除浮动列并使用ADD 将它们放回原处。我没有命名为其他内容的列中包含空值。 请记住,浮点值(如 float 或 double)总是存在精度问题。 伟大的点曼德拉恩克。如果精度很重要,则应使用 cql 十进制类型。【参考方案2】:

此外,如果由于某种原因您无法更改列定义,将浮点值转换为字符串并将 str 传递给 cassandra-driver 也可以解决您的问题。

它将能够从str中生成精确的十进制值。

【讨论】:

以上是关于Python Cassandra 浮动精度损失的主要内容,如果未能解决你的问题,请参考以下文章

强一致性模式下的 Cassandra 可用性损失

C# 中的双倍比较精度损失,加减双精度时发生精度损失

绘制学习模型的训练损失和验证损失图形绘制训练精度和验证精度图形

java 将浮动强制转换为双精度,强制精度为2位数

如何保持浮点/双精度算术确定性?

犰狳:矩阵乘法精度损失