首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以尽可能高的精度打印8个字符的浮点数

以尽可能高的精度打印8个字符的浮点数
EN

Stack Overflow用户
提问于 2013-02-27 01:27:04
回答 2查看 660关注 0票数 0

我正在寻找一种在Python中打印浮点数的有效方法,在8个字符中具有最高的精度。根据数字的不同,可以使用%f%e格式。您可以省略前导零和尾随零,因此可以将-0.123456写为-.123456。如果使用科学记数法,也可以省略"e“,这样-1.234e-8就可以写成-1.234-8

我基本上是在寻找一个更快的版本:http://code.google.com/p/pynastran/source/browse/trunk/pyNastran/bdf/fieldWriter.py#80

分析后,我发现我的代码在链接例程中花费了大约一半的时间,该例程被调用了数十万次。

EN

回答 2

Stack Overflow用户

发布于 2013-02-27 06:33:59

这可能是一个有点不同的方向,但是使用python3-64使用内置的十进制模块有大量的小数。

http://docs.python.org/3.3/library/decimal.html#

下面是一个示例:

代码语言:javascript
复制
>>> from decimal import *
>>> getcontext().prec = 20
>>> D = decimal.Decimal
>>> D('1')/D('22')
Decimal('0.045454545454545454545')
>>> getcontext().prec = 40
>>> D('1')/D('22')
Decimal('0.04545454545454545454545454545454545454545')
>>> 

PS。由于条款和条件始终适用,请务必查看顺序操作的说明:http://docs.python.org/3.3/library/decimal.html#mitigating-round-off-error-with-increased-precision

票数 0
EN

Stack Overflow用户

发布于 2013-02-27 22:08:34

这是我能想到的最好的。它比我之前使用的函数更具可读性(在我看来),但速度并不快。

代码语言:javascript
复制
def print_float_8(val, tol=0.0):
    if abs(val) <= tol:
        return '      0.'
    if val < 0:
        return print_float_neg_8(val)
    else:
        return print_float_pos_8(val)

def print_float_pos_8(val):
    if val < 0.01 or val > 100000:
        return print_float_sci_pos_8(val)
    if val < 0.1:
        f = '%8.6g' % val
    else:
        f = '%8.7g' % val
    if len(f) > 8:
        f = f.lstrip('0')
    return f

def print_float_sci_pos_8(val):
    if val < 1.0e-9:
        f = ('%10.3e' % val).replace('e-', '-')
    elif val < 1:
        f = ('%10.4e' % val).replace('e-0', '-')
    elif val <= 1.0e9:
        f = ('%10.4e' % val).replace('e+0', '+')
    else:
        f = ('%10.3e' % val).replace('e+', '+')
    return f.strip()

def print_float_neg_8(val):
    if val > -0.01 or val < -10000:
        return print_float_sci_neg_8(val)
    if val > -0.1:
        f = '%8.5g' % val
    else:
        f = '%8.6g' % val
    if len(f) > 8:
        f = f.replace('-0.', '-.')
    return f

def print_float_sci_neg_8(val):
    if val > -1.0e-9:
        f = ('%-8.2e' % val).replace('e-', '-')
    elif val > -1:
        f = ('%-8.3e' % val).replace('e-0', '-')
    elif val >= -1.0e9:
        f = ('%-8.3e' % val).replace('e+0', '+')
    else:
        f = ('%-8.2e' % val).replace('e+', '+')
    return f.strip()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15095411

复制
相关文章

相似问题

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