1

有効数字 (数値) に基づく Python の文字列変換関数/モジュールを探しています。この機能の有用性は何度か取り上げられているため、Pythonにはこれを簡単に行うための関数やモジュールがまだないとは信じがたいようです。何か新しいものが出たかどうか知っている人はいますか?そうでない場合、これは機能リクエストの良い機会でしょうか?

免責事項:

  1. これはすでにいくつかの質問があるトピックであることを認識していますが、それらのほとんどは数年前のものです. 私は何かが最近リリースされたことを願っています。
  2. また、これを手動で行う関数を作成するのは比較的簡単であることも認識していますが、移植性のためにモジュールまたは (より良い) 組み込み関数を使用することをお勧めします。
  3. 出力が指数表記になることを望んでいません

機能例:

>>> from somemodule import SDStr

>>> SDStr(num=1234, sigDigs=3)
'1230'

>>> SDStr(num=12.3456, sigDigs=4)
'12.35'

>>> SDStr(num=100, sigDigs=3)
'100.'

>>> SDStr(num=100.0, sigDigs=2)
'100'

>>> SDStr(num=100, sigDigs=4)
'100.0'

>>> SDStr(num=0.001234, sigDigs=2)
'0.0012'
4

1 に答える 1

0
import decimal

def rounded(number, figures):
    number = decimal.Decimal(number)
    return format(round(number, -number.adjusted()-1+figures), "f")

decimal10進数を追跡するので、明らかにこれが物事を行う方法です。

最上位桁の桁数で有効数字の数を調整し、浮動小数点数にフォーマットします。それは魅力のように機能します。

編集:何らかの理由で Python 2 はこれを好まない。調べてみます。

まあ、基本的に Python 2 では(真剣に、Python 3 に移行します) にround強制するfloatので、簡単な答えは次のとおりです。

from decimal import Decimal

def rounded(number, figures):
    number = Decimal(number)
    decimal_shift = -number.adjusted()-1+figures
    integral = round(number * Decimal(10) ** decimal_shift)
    rounded_decimal = Decimal(integral) * Decimal(10) ** -decimal_shift
    return format(rounded_decimal, "f")
于 2013-09-27T19:28:45.983 に答える