Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python decimal.以科学记数法产生十进制结果_Python_Python 3.x_String_Decimal_Scientific Notation - Fatal编程技术网

Python decimal.以科学记数法产生十进制结果

Python decimal.以科学记数法产生十进制结果,python,python-3.x,string,decimal,scientific-notation,Python,Python 3.x,String,Decimal,Scientific Notation,我把一个很长的数分成更小的数。两者都是decimal.decimal()类型 结果是用科学记数法得出的。我该怎么阻止这一切?我需要把数字全部打印出来 >>> decimal.getcontext().prec 50 >>> val Decimal('1000000000000000000000000') >>> units Decimal('1500000000') >>> units / val Decimal('1.5E

我把一个很长的数分成更小的数。两者都是decimal.decimal()类型

结果是用科学记数法得出的。我该怎么阻止这一切?我需要把数字全部打印出来

>>> decimal.getcontext().prec
50
>>> val
Decimal('1000000000000000000000000')
>>> units
Decimal('1500000000')
>>> units / val
Decimal('1.5E-15')

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

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

In [29]: print(f"{units/val:.50f}")                                                                                                                    
0.00000000000000150000000000000000000000000000000000
不幸的是,无法自行消除右侧的冗余零。(左侧可以填充“0”、“0”、自定义字符,但小数点分隔符后的所有精度都转换为尾随的0)

由于查找最低有效非零位非常复杂,因此我们可以在格式表达式中使用从数字中提取的参数而不是“50”来表示精度,更简单的方法是在格式化后使用字符串
。rstrip
方法删除这些零:


在[30]中:打印(f“{units/val:.50f}”.rstrip(“0”))
0.0000000000000015
简言之:这似乎是唯一的方法:在所有接口点中,当数字从核心输出到以字符串形式表示的输出时,使用定点表示法以超出精度的精度对其进行格式化,并使用f-string去除尾随零:

return template.render(number=f"{number:.50f}".rstrip("0"), ...)

使用浮点型指示符
{:f}
将十进制数呈现为格式化字符串,无论它是非常大的整数还是非常大的十进制数,它都将显示正确的位数来表示整数

>>> 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}
也同样只有在数字是大整数而不是长小数时才有效

但书

然而,Decimal()有一个有效位的概念,如果它认为需要,它将添加尾随的零

其思想是,它可以智能地处理您可能处理货币数字的情况,例如
.10.15
。要使用中的示例,请执行以下操作:

如果格式化Decimal(),则没有区别-如果Decimal()认为它是重要的,则仍然会得到尾随的零:

>>> "{:,f}".format( decimal.Decimal('1.30') +  decimal.Decimal('1.20'))
'2.50'
当你把千和分数放在一起处理时,同样的事情也会发生(也许是出于某种原因?)

>>> decimal.Decimal(2500) * decimal.Decimal('0.001')
Decimal('2.500')
使用Decimal()删除有效的尾随零。normalize()方法:


使用格式化哦,是的,当然。最好的是,实际上根本不需要指定小数点:
print(“{:,f}”)。格式(单位/val)“0.00000000000000 15”
这样,当十进制数小于格式宽度时,在最后一个十进制数后就不会出现无用的零,因此可以容纳非常大的数字,而无需猜测它们的大小。感谢您纠正我的深夜迷雾。
>>> decimal.Decimal(2500) * decimal.Decimal('0.001')
Decimal('2.500')
>>> (2500 * decimal.Decimal('0.001')).normalize()
Decimal('2.5')