首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成科学表示法的Python decimal.Decimal

生成科学表示法的Python decimal.Decimal
EN

Stack Overflow用户
提问于 2021-06-07 23:19:06
回答 2查看 509关注 0票数 2

我把一个很长的部分除以小得多的数字。这两种类型都是decimal.Decimal()。

结果是用科学的符号表示出来的。我该怎么阻止这一切?我要把号码全打印出来。

代码语言:javascript
复制
>>> decimal.getcontext().prec
50
>>> val
Decimal('1000000000000000000000000')
>>> units
Decimal('1500000000')
>>> units / val
Decimal('1.5E-15')
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-08 09:01:36

将十进制呈现为一个带有浮点类型指示符{:,f}的格式化字符串,它将显示正确的数字数来表示整个数字,而不管它是一个非常大的整数还是一个非常大的十进制。

代码语言:javascript
复制
>>> val
Decimal('1000000000000000000000000')

>>> units
Decimal('1500000000')

>>> "{:,f}".format(units / val)
'0.0000000000000015'

# very large decimal integer, formatted as float-type string, appears without any decimal places at all when it has none! Nice!

>>> "{:,f}".format(units * val)
 '1,500,000,000,000,000,000,000,000,000,000,000'

您不需要指定小数位。它只显示表示数字所需的数量,省略了在小数点小于固定格式宽度时出现在最后十进制数字之后的无用零的轨迹。如果这个数字没有小数部分,你就不会得到任何小数位。

因此,非常大的数字可以容纳,而不必再猜测它们有多大。你也不必猜测它们是否也会有小数位。

任何指定的数千分隔符 {:,f}也只有在数字是一个大整数而不是长小数点时才有效果。

但书

但是,十进制()有重要位置的概念,如果它认为需要它们,它将添加尾随零。

这样做的想法是,它智能地处理可能处理货币数字(如£ 10.15 )的情况。使用文档中的示例

代码语言:javascript
复制
>>> decimal.Decimal('1.30') +  decimal.Decimal('1.20')
Decimal('2.50')

如果格式化Decimal() -如果Decimal()认为它是重要的,那么仍然会得到尾随为零的值。

代码语言:javascript
复制
>>> "{:,f}".format( decimal.Decimal('1.30') +  decimal.Decimal('1.20'))
'2.50'

同样的事情也会发生(也许有什么好的理由?)当你把成千上万的分数放在一起时:

代码语言:javascript
复制
>>> decimal.Decimal(2500) * decimal.Decimal('0.001')
Decimal('2.500')

使用Decimal().normalize()方法删除重要的尾随零

代码语言:javascript
复制
>>> (2500 * decimal.Decimal('0.001')).normalize()
Decimal('2.5')
票数 1
EN

Stack Overflow用户

发布于 2021-06-07 23:55:04

精度是在内部保持的--您只需在将十进制值导出到字符串时显式调用所需的小数位数即可。

因此,如果要打印,或者在HTML模板中插入值,第一步是使用string format方法(或f-string),以确保包含数字:

代码语言:javascript
复制
In [29]: print(f"{units/val:.50f}")                                                                                                                    
0.00000000000000150000000000000000000000000000000000

不幸的是,字符串格式的小型语言没有办法自己消除右手边的多余零。(左边可以填充"0“、”“、自定义字符,任何想要的字符,但是十进制分隔符之后的所有精度都会转换为尾随0)。

由于找到最不重要的非零数字是很复杂的,否则我们可以使用从数字中提取的参数而不是"50“作为格式表达式的精度,更简单的方法是在格式化发生后使用字符串.rstrip方法删除这些零:

代码语言:javascript
复制
In [30]: print(f"{units/val:.50f}".rstrip("0"))                                                                                                        
0.0000000000000015

简而言之:这似乎是唯一的方法:在所有接口点中,在所有的接口点中,当数字将核心留给输出时,将其表示为字符串,则使用不动点表示法将其格式化为多余的精度,并用f- string删除尾流零:

代码语言:javascript
复制
return template.render(number=f"{number:.50f}".rstrip("0"), ...)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67879685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档