四捨五入せずに浮動小数点値を正確に切り捨てるにはどうすればよいですか?

DDD
リリース: 2024-11-05 19:47:02
オリジナル
739 人が閲覧しました

How to Precisely Truncate Float Values Without Rounding?

正確に切り捨てられた浮動小数点値を取得する方法

浮動小数点値の切り捨て、または指定された小数点以下の桁数を超える桁の削除は、プログラミングにおける一般的な操作です。ただし、浮動小数点表現の制限により、丸めずに正確な切り捨てを実現することは困難な場合があります。

問題を理解する

次の例を考えてみましょう。

1.923328437452 -> 1.923
ログイン後にコピー

単純アプローチとしては、浮動小数点を文字列に変換して切り捨てることになりますが、浮動小数点表現の不正確な性質により、エラーが発生する可能性があります。異なる浮動小数点値が同じバイナリ表現を持つ場合があり、その結果、あいまいな切り捨てが行われる可能性があります。

推奨方法

Python バージョン 2.7 以降の場合、次の関数は丸めなしで正確な切り捨てを提供します。

def truncate(f, n):
    '''Truncates/pads a float f to n decimal places without rounding'''
    s = '{}'.format(f)
    if 'e' in s or 'E' in s:
        return '{0:.{1}f}'.format(f, n)
    i, p, d = s.partition('.')
    return '.'.join([i, (d+'0'*n)[:n]])
ログイン後にコピー

説明

このメソッドの核心は、'{}'.format(f) を使用して float を文字列に変換し、その文字列を必要な小数点以下の桁数に切り捨てることです。科学的表記法 ('e' または 'E') の値の場合、'{0:.{1}f}'.format(f, n) 構文を使用して精度を指定します。

特殊な処理ケース

まれに、丸め数値に非常に近い浮動小数点数が依然として誤って切り捨てられることがあります。このような場合は、より高い精度を指定して、文字列変換中の丸めが結果に影響しないようにします。

古い Python バージョンの代替手段

Python バージョン 2.7 より前の場合、精度の低い方法で丸めが行われます。切り捨ての前に浮動小数点を小数点以下 12 桁に変換します:

def truncate(f, n):
    '''Truncates/pads a float f to n decimal places without rounding'''
    s = '%.12f' % f
    i, p, d = s.partition('.')
    return '.'.join([i, (d+'0'*n)[:n]])
ログイン後にコピー

結論

このコードは、四捨五入せずに浮動小数点値を切り捨てる堅牢なソリューションを提供し、広範囲の入力に対して正確な切り捨てを保証します。

以上が四捨五入せずに浮動小数点値を正確に切り捨てるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!