【问题标题】:Why floating point representation are discouraged in ClickHouse tables?为什么在 ClickHouse 表中不鼓励浮点表示?
【发布时间】:2018-04-25 23:48:54
【问题描述】:

documentation 并没有真正解释 Float32Float64 的行为以及他们不受欢迎的原因。

我之所以问这个问题,是因为在将这些论文与控制台 cli 请求或 Rest 请求一起使用时,我看到了奇怪的行为。无论精度如何,发送到 clickhouse 的浮点值都会在最后一位略微修改。

示例:1258.021545 变为 1258.0215453

每次我插入这些值时,最后一个数字都会改变。 我不认为问题来自于太高的精度值,因为这些值来自 Java 双精度值。

【问题讨论】:

  • 你能补充更多细节吗?
  • 您插入了 1258.021545 但看到插入了 1258.0215453?需要更多解释。
  • 是的,这就是我所看到的。什么样的解释?

标签: floating-point clickhouse decimal-point


【解决方案1】:

浮点数问题

通常,浮点数的计算可能会产生舍入误差。

Java

请考虑学习 Java 编程语言中double(浮点型二进制点类型)和BigDecimal(浮点型小数点类型)之间的区别.

比如有一个相关问题:java - Double vs. BigDecimal? - Stack Overflow

点击屋

来自Float32, Float64 | ClickHouse Documentation

使用浮点数

  • 浮点数的计算可能会产生舍入误差。

    SELECT 1 - 0.9
    
    ┌───────minus(1, 0.9)─┐
    │ 0.09999999999999998 │
    └─────────────────────┘
    
  • 计算结果取决于计算方法(计算机系统的处理器类型和架构)。

  • 浮点计算可能会产生诸如无穷大 (Inf) 和“非数” (NaN) 之类的数字。在处理计算结果时应考虑到这一点。

  • 从文本中解析浮点数时,结果可能不是最接近的机器可表示的数字。

一些可能的解决方案

使用整数(推荐)

来自Float32, Float64 | ClickHouse Documentation

我们建议您尽可能以整数形式存储数据。例如,将固定精度数字转换为整数值,例如货币金额或页面加载时间(以毫秒为单位)。

使用十进制数

来自Decimal | ClickHouse Documentation

Decimal(P, S)、Decimal32(S)、Decimal64(S)、Decimal128(S)、Decimal256(S)

在加法、减法和乘法运算期间保持精度的有符号定点数。对于除法,最低有效数字被丢弃(不四舍五入)。

参数

  • P - 精度。有效范围:[ 1 : 76 ]。确定数字可以有多少个十进制数字(包括小数)。
  • S - 刻度。有效范围:[ 0 : P ]。确定分数可以有多少个小数位。

十进制值范围

  • Decimal32(S) - ( -1 * 10^(9 - S), 1 * 10^(9 - S) )
  • Decimal64(S) - ( -1 * 10^(18 - S), 1 * 10^(18 - S) )
  • 十进制128(S) - ( -1 * 10^(38 - S), 1 * 10^(38 - S) )
  • Decimal256(S) - ( -1 * 10^(76 - S), 1 * 10^(76 - S) )

例如,Decimal32(4) 可以包含从 -99999.9999 到 99999.9999 的数字,步长为 0.0001。

【讨论】:

    【解决方案2】:

    ClickHouse 文档反对Float 的唯一原因是rounding error。它与 ClickHouse 本身无关,而是real number representations 的算法。

    • 如果您不介意时不时出现一些舍入错误,请继续使用浮点数。
    • 但是如果你存储代表金钱的数字,花车是一个禁区。在这种情况下,将两个不同字段中小数点左右的部分存储为整数。

    【讨论】:

      猜你喜欢
      • 2012-10-03
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 2015-09-05
      • 2012-12-16
      • 2019-12-19
      相关资源
      最近更新 更多