Python 3:从最左边舍入非常大的十进制数(十进制类型)

Python 3:从最左边舍入非常大的十进制数(十进制类型),python,python-3.x,decimal,rounding,Python,Python 3.x,Decimal,Rounding,我用的是原子钟,那里的频率大约为10兆赫,精度超过18位。因此,对于一些Python应用程序,我需要减去列表的平均值,并将其称为偏移量,这样我就可以使用numpy的float64作为该列表的元素 我的问题如下:假设我有这个号码: d = decimal.Decimal('12345678999999.555544333221') 我希望能够使用以下函数对该数字进行四舍五入: large_round(d,5) 并得到结果: 12345000000000.000000000000 所以我想从最

我用的是原子钟,那里的频率大约为10兆赫,精度超过18位。因此,对于一些Python应用程序,我需要减去列表的平均值,并将其称为偏移量,这样我就可以使用numpy的float64作为该列表的元素

我的问题如下:假设我有这个号码:

d = decimal.Decimal('12345678999999.555544333221')
我希望能够使用以下函数对该数字进行四舍五入:

large_round(d,5)
并得到结果:

12345000000000.000000000000
所以我想从最左边取整,而不是从小数点取整

我的解决方案是:我可以玩游戏,把这个数字转换成一个字符串,然后查找小数点,然后计算我左边有多少位数,然后将它添加到标准Python
round
函数的第二个参数中

但我总是能在Python中找到我所想象的所有函数。那么,有没有一种蟒蛇式的,友好的方式来完成我所寻找的

d2 = decimal.Context(prec=5).create_decimal(d)
创建具有所需精度的新上下文,并使用该上下文从
d
创建新的十进制数



创建一个具有所需精度的新上下文,并使用该上下文从
d

中创建一个新的十进制数,将数字除以值
10*n
,将数字四舍五入,然后再乘以
10*n
?@MoinuddinQuadri有没有一种方法可以获得
n
,而不必将数字解析为字符串?或者可能需要一些
log
s?嗯<代码>getcontext().prec=5;d=十进制('1234567899999.555544333221')+0。但是,是的…@dhke lol。。。这真的很邪恶。。。事实上我不敢那样做。它可能会毁掉所有其他存储的数字@量子物理学家:那么把它转换成
str
有什么问题呢?PS:我不知道有什么有效的方法将其转换为字符串,将数字除以值
10*n
,将数字四舍五入,再乘以
10*n
?@MoinuddinQuadri有没有一种方法可以获得
n
,而不必将数字解析为字符串?或者可能需要一些
log
s?嗯<代码>getcontext().prec=5;d=十进制('1234567899999.555544333221')+0。但是,是的…@dhke lol。。。这真的很邪恶。。。事实上我不敢那样做。它可能会毁掉所有其他存储的数字@量子物理学家:那么把它转换成
str
有什么问题呢?PS:我不知道有什么有效的方法将其转换为StringServer,这会修改主上下文吗?还是它创造了一个临时的?量子物理学家:这不会影响全球环境。太好了!我试试这个!谢谢@量子物理学家:请注意,结果将是十进制('1.2346E+13'),有5个有效数字,因此,如果您希望问题中的所有尾随零都被视为有效数字,您可能必须对其进行调整。此外,默认舍入模式为舍入半偶数,即舍入到最近值,扎带舍入到偶数。这与您问题中的输出也不匹配。我怀疑你刚才的问题中有舍入错误,但如果你真的想舍入到零或负无穷大,你可以指定。谢谢你指出这些细节。不过没关系。我只想减少要减去的位数。没关系:)这会修改主上下文吗?还是它创造了一个临时的?量子物理学家:这不会影响全球环境。太好了!我试试这个!谢谢@量子物理学家:请注意,结果将是十进制('1.2346E+13'),有5个有效数字,因此,如果您希望问题中的所有尾随零都被视为有效数字,您可能必须对其进行调整。此外,默认舍入模式为舍入半偶数,即舍入到最近值,扎带舍入到偶数。这与您问题中的输出也不匹配。我怀疑你刚才的问题中有舍入错误,但如果你真的想舍入到零或负无穷大,你可以指定。谢谢你指出这些细节。不过没关系。我只想减少要减去的位数。没关系:)