如何使用 Python 生成随机 Decimal128、Decimal256 数字

How to generate random Decimal128, Decimal256 numbers with Python

我正在对 ClickHouse database 进行测试以验证 Decimal 数据类型。 根据文档:

十进制参数:

P - 精度。有效范围:[1 : 76]。确定数字可以有多少个小数位(包括分数)。 S - 规模。有效范围:[0 : P]。确定分数可以有多少个小数位。 取决于 P 参数值 Decimal(P, S) 是以下的同义词:

我正在尝试为所有这些数据类型生成随机数。 我已经找到了 good answer,我是这样使用它的:

十进制32:

>>> decimal.Decimal(random.randint(-2147483648, 2147483647))/1000
Decimal('-47484.47')

十进制64:

>>> decimal.Decimal(random.randint(-9223372036854775808, 9223372036854775807))/100000000000
Decimal('-62028733.96730274309')

这两个给了我预期的结果。 但是,我的 Decimal128 函数已经太长并产生了错误的结果:

>>> decimal.Decimal(random.randint(-170141183460469231731687303715884105728, 170141183460469231731687303715884105727))/1000000000000000000000
Decimal('149971182339396169.8957534906')

问题:

如何生成随机的 Decimal128Decimal256

请建议我应该使用什么。

您面临的问题是,精度设置的不够高,无法记录您的分区中的所有数字。修复它的最简单方法是提高精度(以除法和所有其他操作花费更长的执行时间为代价。默认精度设置为 28,即 28 个正确的小数位。这足以满足 Decimal64,但对于 Decimal128Decimal256

来说太少了

要更新你写的精度:

decimal.getcontext().prec = 38 # Maximum number of fractional digits in Decimal128

在此之后您的代码应该可以工作了。当然,对于Decimal256,精度需要设置为76。