当前位置: 首页 > 面试题库 >

以工程格式打印编号

封永嘉
2023-03-14
问题内容

我正在尝试使用python将数字打印成工程格式,但似乎无法正常工作。SEEMS语法很简单,但是却行不通。

>>> import decimal 
>>> x = decimal.Decimal(1000000)
>>> print x
1000000
>>>> print x.to_eng_string() 
1000000

我不知道为什么会这样。这两个值不相等(一个是字符串,另一个是int)。设置各种上下文decimal似乎也无济于事。有任何线索或想法吗?


问题答案:

为了使它起作用,您必须先对小数进行归一化:

>>> x = decimal.Decimal ('10000000')

>>> x.normalize()
Decimal('1E+7')

>>> x.normalize().to_eng_string()
'10E+6'

可以通过深入研究源代码来发现其原因。

如果您检查to_eng_string()在Python
2.7.3源代码树(Lib/decimal.py从gzip压缩的源焦油球在这里),它只是简单地调用__str__eng设置为true。

然后,您可以看到它决定了最初使用十进制小数点左边的位数:

leftdigits = self._exp + len(self._int)

下表显示了这两件事的值:

                         ._exp       ._int         len   leftdigits
                         -----       ---------     ---   ----------
Decimal (1000000)            0       '1000000'       7            7
Decimal ('1E+6')             6       '1'             1            7

此后继续的代码是:

if self._exp <= 0 and leftdigits > -6:
    # no exponent required
    dotplace = leftdigits
elif not eng:
    # usual scientific notation: 1 digit on left of the point
    dotplace = 1
elif self._int == '0':
    # engineering notation, zero
    dotplace = (leftdigits + 1) % 3 - 1
else:
    # engineering notation, nonzero
    dotplace = (leftdigits - 1) % 3 + 1

并且您会看到,除非它已经 具有 一定范围内的指数(self._exp > 0 or leftdigits <= -6),否则在字符串表示形式中将不会给出任何指数。

进一步的调查显示了这种行为的原因。查看代码本身,您将看到它基于General Decimal Arithmetic Specification(此处的PDF
)。

如果您搜索该文档to-scientific-string(基于文档to-engineering-string),则部分说明(措辞并加粗体):

如果需要指数 ,“ to-scientific-string”操作会将数字转换为字符串,并使用科学计数法 该操作不受上下文的影响。

如果该数字是有限数,则:

该系数首先使用从0到9的字符转换为以10为底的字符串,且不带前导零(除非其值为零,在这种情况下使用单个0字符)。

接下来,计算调整后的指数。这是指数,加上转换系数中的字符数,再减去一个。也就是说,指数+(clength-1),其中clength是系数的长度(以十进制数字表示)。

如果指数小于或等于零,并且调整后的指数大于或等于-6,则数字将转换为字符形式而无需使用指数表示法。
在这种情况下,如果指数为零,则不添加小数点。否则(指数为负),将插入一个小数点,该指数的绝对值指定小数点右边的字符数。必要时,将“
0”字符添加到转换系数的左侧。如果在插入后小数点之前没有字符,则以常规的“ 0”字符为前缀。

换句话说,它正在做它正在做的事情,因为这就是标准告诉它要做的事情。



 类似资料:
  • 问题内容: 我的页面上有一些价格值要显示。 我正在编写一个接受浮动价格并返回带有货币代码的格式化货币val的函数。 例如应打印 问题答案: 最简单的答案是。 如果您希望您的应用程序能够使用多种货币和支持区域设置的格式(例如,对于我们中的某些欧洲人而言),它将变得更加复杂。 有,但是在Windows上不起作用,而是依靠,我认为这是垃圾,因为它需要在服务器端安装(任意命名)语言环境软件包。 如果要认真

  • 问题内容: ls命令以以下格式打印时间: 我如何转换,从接收到的时间的这个格式的本地时间? 问题答案: 使用strftime(您需要先转换为): 格式: 这是完整的代码:

  • 标准输出 1.gossh远程执行命令返回格式. #批量模式首行首先打印所有的远程机器IP. [servers]=[192.168.56.2 192.168.56.2] #机器ip ip=xxx.xxx.56.2 #远程执行命令 command=uname #命令执行完后的退出值,就是$? return=0 #远程执行命令输出到标准输出和错误输出的结果 Linux ##换行和---分隔线 ---

  • 问题内容: 与MySQL使用Python在控制台中打印结果一样,最简单的打印MySQL查询结果的方法是什么?例如,我想得到类似的东西: 注意:我不知道每列的最大宽度是先验的,但是我希望能够不重复两次就可以做到这一点。是否应为每列添加查询的length()?MySQL如何做到这一点,以免严重影响内存或处理时间? 编辑 我认为这与问题无关,但这是我发送的查询: 这是我使用的python代码: 但是此代

  • 问题内容: 如何以矩阵框格式打印出简单的int [] [],就像我们在其中手写矩阵的格式那样。简单的循环运行显然无效。如果有帮助,我正在尝试在linux ssh终端中编译此代码。 问题答案: 产生:

  • 我有一个DateTime对象,我想用给定的格式打印它,比方说。 我已经试过了 但是得到了yyyyy-MM-dd,好像格式不被识别。 我也试过了 但是 无法将给定对象格式化为日期java.lang.IllegalArgumentExc0019:无法将给定对象格式化为日期 如何以我选择的格式打印DateTime对象?