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

Posted

技术标签:

【中文标题】如何使用 Python 生成随机的 Decimal128、Decimal256 数字【英文标题】:How to generate random Decimal128, Decimal256 numbers with Python 【发布时间】:2021-04-29 12:24:56 【问题描述】:

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

十进制参数:

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

P 来自 [1 : 9] - 用于 Decimal32(S) P 来自 [10 : 18] - 用于 Decimal64(S) P 来自 [19 : 38] - 用于 Decimal128(S) P 来自 [39 : 76] - 用于 Decimal256(S)

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

Decimal32:

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

Decimal64:

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

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

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

问题:

如何生成随机的Decimal128Decimal256

请建议我应该使用什么。

【问题讨论】:

【参考方案1】:

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

来说太少了

更新你写的精度:

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

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

【讨论】:

非常感谢!如果有其他方法,我会等待。如果没有其他人回答,我会接受你的回答。 还有其他方法,例如以字符串格式生成数据,然后将其直接读入Decimal对象,以字符串为参数。但是,这很可能更麻烦。如果您认为需要,也可以在完成数据生成后将精度重置为 28。 它非常适合我。非常感谢!

以上是关于如何使用 Python 生成随机的 Decimal128、Decimal256 数字的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 生成大于指定值的随机数?

python如何一次性取出多个随机数

如何生成随机整数列表,但仅使用指定的整数? (Python)[重复]

如何将 Python 的随机数生成器与本地种子一起使用?

如何使用python生成均匀分布在以(0,0)为中心的40 * 40矩形区域上的随机点?

如何在 Python 中为截断的正态分布生成相关随机数?