因为documentation并没有真正解释Float32和Float64的行为以及为什么不鼓励它们。
我问这个问题,因为我在使用控制台cli请求或休息请求时会看到奇怪的行为。发送到clickhouse的浮点值在最后一位数稍微修改,无论精度如何。 例如: 1258.021545成为1258.0215453
每次插入这些值时,最后一位数字都会改变。 我不认为problème来自高精度值,因为这些值来自java双精度。
答案 0 :(得分:0)
Clickhouse文档禁止Float
的唯一原因是rounding error。它与Clickhouse本身无关,而是与real number representations的算法无关。
如果您不时地忽略一些错误,请继续使用浮点数。但是你应该存储代表金钱的数字,浮点数是一个禁区,在这种情况下,将两个不同字段中的小数点左右存储为整数
答案 1 :(得分:0)
通常,使用浮点数进行计算可能会产生舍入误差。
请考虑了解 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:
<块引用>在加、减和乘运算过程中保持精度的有符号定点数。对于除法,最低有效数字被丢弃(不四舍五入)。
<…>
例如,Decimal32(4) 可以包含从 -99999.9999 到 99999.9999 的数字,步长为 0.0001。