如何强制python浮点数不使用指数

How to force a python float to not use exponents

提问人:Jiminion 提问时间:9/17/2023 最后编辑:Jiminion 更新时间:9/20/2023 访问量:73

问:

我有一些问题,但这似乎是要点。

我有一些文本数字是用 Python 读入的,乘以 1000.0,然后使用,最终打印出来。

Data.Kin.X.L.Vals = -.800E-01 -.750E-01 -.700E-01 -.650E-01 -.600E-01 -.550E-01 -.500E-01

因此,在乘以 (1000.0) 之后,值应该(如果有的话会很好)为:

New.vals = -80。-75.-70.-65.-60.-55.-50.

有时(很少)他们是。但通常它们保持指数形式:

典型值 = -8.00E+01 -7.50E+01 -7.00E+01 -6.50E+01 -6.00E+01 -5.50E+01 -5.00E+01

我尝试过round(x,n),但这似乎不起作用。此外,这些是 numpy 数组中的值,如果这有什么不同的话。

这是用于创建打印出来的字符串的代码:

           out = f'{k.strip()} = ' \
                                     + np.array2string(v,
                                        prefix=f'{k} = ',
                                        precision=5,
                                        max_line_width=200,
                                        floatmode='maxprec') + '\n'

更新:

我很快就会结束这个。总体上最好的工作答案是使用:

np.set_printoptions(suppress=True)

如果需要,您可以扩展精度,以便覆盖不会“绊倒”,并将它们保留为科学记数法。大于 8 的内容:

np.set_printoptions(精度=10)

它与numpy如何打印数据无关,尽管它确实与numpy有关。

Python Numpy 浮点

评论

5赞 B. Pantalone 9/17/2023
你是怎么打印数字的?显示代码。
0赞 Xukrao 9/17/2023
这回答了你的问题吗?漂亮地打印一个没有科学记数法和给定精度的 NumPy 数组
0赞 Jiminion 9/17/2023
@Xukrao 这很接近,但我折叠了很小的指数(比如少于 3 个绝对值),并没有在所有情况下完全消除它们。
0赞 tdelaney 9/17/2023
这些不是 python 浮点数。这是一件麻木的事情吗?您需要展示您是如何获得打印数据的。你不需要展示这个东西,不管它是什么,都是计算出来的。只是一个最小的例子。Data.Kin.X.L.Vals
0赞 Jiminion 9/20/2023
@tdelaney 请参阅更新。是的,它确实与 Numpy 有关,正如原始帖子中提到的。

答:

1赞 Xukrao 9/17/2023 #1

据我所知,没有可用于设置值的选项,当超过该值时会触发科学记数法。但是,您可以定义自己的字符串生成函数:

import numpy as np


def arr2str(arr, big=1e3, small_precision=0, big_precision=2):
    """Convert 1D array with floats to string.
    
    Parameters
    ----------
    arr : np.ndarray[float]
        To-be-converted array.
    big : float, optional
        Numbers for which the absolute value is >= `big` are considered big and
        will be printed in scientific notation. Otherwise the number is
        considered small and will not be printed in scientific notation.
    small_precision : float, optional
        Precision for small numbers.
    big_precision : float, optional
        Precision for big numbers.
    
    Returns
    -------
    str
    
    """
    # Check input validity
    if not arr.ndim == 1:
        raise ValueError("Array does not have a dimension of one")
    if not isinstance(arr[0], np.floating):
        raise ValueError("Array does not contain floats")
        
    str_list = []
    for ele in arr:
        if abs(ele) >= big:
            str_list.append(f'{ele:.{big_precision}e}')
        else:
            str_list.append(f'{ele:.{small_precision}f}')
    string = ' '.join(str_list)
    string = '[' + string + ']'
    return string


# Usage example
example_arr = np.array([-80., -75., -70., -65., 55., -50., 4294, -64921])
print(arr2str(example_arr))

指纹:

[-80 -75 -70 -65 55 -50 4.29e+03 -6.49e+04]