質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

29383閲覧

Pythonで小数点以下第3位まで表示して、それ以下は切り捨てて表示させたい

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2016/06/03 04:40

編集2016/06/15 06:21

Pythonで以下のコードがあります。

print ("%.3f" % value)

これを小数点以下第3位まで表示させて、かつそれ以下は切り捨てで表示させる書き方がございましたらお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

decimal を使ってください。

python

1import decimal 2 3v = 1.888888888 4print('{:.3f}'.format(v)) # -> 1.889 5print('{}'.format(round(v, 3))) # -> 1.889 6 7with decimal.localcontext() as ctx: 8 ctx.rounding = decimal.ROUND_FLOOR # -∞方向に丸める ≒ 切り捨て 9 v = round(decimal.Decimal(v), 3) # 3桁, FLOORモードで丸め 10print('{}'.format(v)) # -> 1.888

--- 追記
改めた点はlocalcontext()/round()を使わず、quantize()メソッドにしたこと。それと負の場合に切り捨てにならないので、ROUND_DOWNに変更しています。動作確認はPython3.5.1とPython2.7.11。

python

1from decimal import (Decimal, ROUND_DOWN) 2 3def round_down3(value): 4 value = Decimal(value).quantize(Decimal('0.001'), rounding=ROUND_DOWN) 5 return str(value) 6 7print(round_down3(188888.8888888)) 8print(round_down3(1.8888899999)) 9print(round_down3(0.9999999999)) 10print(round_down3(-1.9999999999)) 11 12# 出力 13# 188888.888 14# 1.888 15# 0.999 16# -1.999

投稿2016/06/03 06:18

編集2016/06/06 08:53
sharow

総合スコア1151

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/06/03 23:02 編集

これを関数の中で戻り値として出したいんですが、Attribute Errorがでます。 def xxx(): maxsumdata = max(datapoints,key=lambda x:x['Timestamp']) sumvalue = maxsumdata['Sum'] consumedvalue = sumvalue / 60 with decimal.localcontext as ctx: ctx.rounding = decimal.ROUND_FLOOR counsumedfloor = round(decimal.Decimal(consumedvalue),3) return ('{}'.format(counsumedfloor)) if __name__ == '__main__': print(xxx())
退会済みユーザー

退会済みユーザー

2016/06/03 13:57

AttributeError: 'function' object has no attribute '__exit__'のエラーが出てしまいます。
sharow

2016/06/03 14:41

with decimal.localcontext as ctx: --> with decimal.localcontext() as ctx:
退会済みユーザー

退会済みユーザー

2016/06/03 15:21

タイポしてました。今度はCannot convert float to Decimal. First convert the float to a stringのエラーが出て型変換をして試したましたが、うまくいきません。consumedvaluie = float(sumvalue) / 60も試しました。
退会済みユーザー

退会済みユーザー

2016/06/03 15:43 編集

型変換は解決しましたが、global name 'counsumedfloor' is not definedのエラーが出てはまってしまってます。値をとってくる場合で難しいんでしょうか。
sharow

2016/06/03 15:38

" First convert the float to a string"、「最初にfloatからstringに変換してください」と言っています。かなり古いPythonを使っておられるようです。 round(decimal.Decimal(str(consumedvalue)), 3) か round(decimal.Decimal.from_float(consumedvalue), 3) を試してみてください。
退会済みユーザー

退会済みユーザー

2016/06/03 15:48

NameError: global name 'consumedfloor' is not definedのエラーはどのように解決すればよろしいでしょうか。初心者で申し訳ございません。
sharow

2016/06/03 16:13

それはあなたが使ってる変数名なので、知りませんとしか言い様がありません…。
sharow

2016/06/03 16:24

本当に気を付けて1文字ずつ確認してみてください。
退会済みユーザー

退会済みユーザー

2016/06/03 23:14

確認できました。お手数おかけいたしました。
退会済みユーザー

退会済みユーザー

2016/06/06 07:59

すみません。一度実行してみましたところ、結果が1.889になることが発覚しました。 Python2.7です。今一度ご確認いただけますでしょうか。
sharow

2016/06/06 08:09

あなたが何をしたのかわかりませんで、確認のしようがありません。問題のソースコードを質問文に追記していただけると手伝えるかもしれません。 何をしたのか説明せず状況だけ説明されても答えられませんよ。
退会済みユーザー

退会済みユーザー

2016/06/06 08:12

失礼いたしました。最初に提示されましたサンプルコードを実行してみました。 v = 1.888888888 with decimal.localcontext() as ctx: ctx.rounding = decimal.ROUND_FLOOR # -∞方向に丸める ≒ 切り捨て v = round(decimal.Decimal(v), 3) # 3桁, FLOORモードで丸め print('{}'.format(v)) こちらのコードを実行した結果が1.888の想定結果になるはずが1.889になりました。
退会済みユーザー

退会済みユーザー

2016/06/06 08:13

import decimalを最初に記入します。
sharow

2016/06/06 08:40

python2.7で試して再現できました。roundとcontextの関係が2と3で異なるのかもしれません(ドキュメントにも書いてないので分からず)。別解を解答欄に追記します。
退会済みユーザー

退会済みユーザー

2016/06/06 09:12

ありがとうございます。こちらで同じ結果になることを確認できました。いろいろお手数おかけいたしました。
guest

0

python 小数 切り捨て
で google 検索すれば、いろいろ情報が得られると思います。

検索結果例:

...
n = 123.987654
print "round(n,3) = " + str(round(n,3)) # round(n,3) = 123.988
...

投稿2016/06/03 12:38

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

sumvalue = float(50)
consumedvalue = sumvalue / 60
return (round(consumedvalue, 3))

sumvalueをfloat型にして結果の方ではroundを使ったらどうでしょうか。

投稿2016/06/03 05:06

YanKilo_Charlie

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YanKilo_Charlie

2016/06/03 05:07

このexampleだと結果は 0.833 です。
退会済みユーザー

退会済みユーザー

2016/06/06 09:12 編集

ありがとうございます。こちらで同じ結果になることを確認できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問