为什么浮点表示在clickhouse表中被论述?

时间:2017-11-13 10:15:42

标签: clickhouse

因为documentation并没有真正解释Float32和Float64的行为以及为什么不鼓励它们。

我问这个问题,因为我在使用控制台cli请求或休息请求时会看到奇怪的行为。发送到clickhouse的浮点值在最后一位数稍微修改,无论精度如何。 例如: 1258.021545成为1258.0215453

每次插入这些值时,最后一位数字都会改变。 我不认为problème来自高精度值,因为这些值来自java双精度。

2 个答案:

答案 0 :(得分:0)

Clickhouse文档禁止Float的唯一原因是rounding error。它与Clickhouse本身无关,而是与real number representations的算法无关。 如果您不时地忽略一些错误,请继续使用浮点数。但是你应该存储代表金钱的数字,浮点数是一个禁区,在这种情况下,将两个不同字段中的小数点左右存储为整数

答案 1 :(得分:0)

浮点数问题

通常,使用浮点数进行计算可能会产生舍入误差。

Java

请考虑了解 double(浮点二进制点类型)和 BigDecimal(浮点十进制点类型)之间的区别Java 编程语言。

例如,有一个相关的问题: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) )
  • Decimal128(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。