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

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

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

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

Q&A

解決済

1回答

1111閲覧

Cythonで小数の桁数指定の丸め込みを行いたい

ntsk2543

総合スコア4

Python

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

0グッド

0クリップ

投稿2021/11/01 05:50

編集2021/11/01 08:04

前提・実現したいこと

Cythonで小数の桁数指定での丸め込みをしたいです。例えば,小数第4位で丸める場合、
0.4658→0.465
の様な動作を期待しています。
Pythonで行える様にround関数を用いたところ、エラーが発生します。

発生している問題・エラーメッセージ

Error compiling Cython file: ------------------------------------------------------------ ... cdef float a a=0 for i in range (10000): print(a) a=round(a+0.001,4) ^ ------------------------------------------------------------ test_round.pyx:12:15: Call with wrong number of arguments (expected 1, got 2)

該当のソースコード

Cython

1import pyximport 2from libc.math cimport round 3 4def test_round(): 5 6 cdef int i 7 cdef float a 8 a=0 9 10 for i in range (10000): 11 print(a) 12 a=round(a+0.001,4)

試したこと

まず以下の様にプログラムを作成すると以下の様な出力が得られました。(出力結果は省略しています)

Cython

1def test_round(): 2 3 cdef int i 4 cdef float a 5 a=0 6 7 for i in range (10000): 8 print(a) 9 a=round(a+0.001,4)
9.0 9.00100040435791 9.001999855041504 9.003000259399414 9.003999710083008 9.005000114440918 9.005999565124512 9.006999969482422 9.008000373840332 9.008999824523926 9.010000228881836 9.01099967956543 ・・・

その後、先程のコードに修正したところエラーが発生し、次にroundの引数を1つにしたところ以下の出力が得られました、

0.0 0.0 0.0 0.0 0.0 0.0 0.0 ・・・

追記:1000を掛けて四捨五入を行い、整数にしたあとで1000で割ればいいようです。
Pythonで使用可能なDecimalはCythonでも使用可能みたいです。

Cython

1from decimal import Decimal, ROUND_HALF_UP 2def test_round(): 3 4 cdef int i 5 cdef float x,b 6 x=3.0 7 for i in range(1000): 8 b=x 9 b=b*1000 10 y = Decimal(str(b)) 11 a = y.quantize(Decimal('0'), rounding=ROUND_HALF_UP) 12 a=a/1000 13 print(a) 14 x=x+0.001
3 3.001 3.002 3.003 3.004 3.005 3.006 3.007 ・・・

更に追記:コメントでご教示いただきましたが上のコードはまどろっこしいです。

Cython

1def test_round(): 2 3 cdef int i 4 cdef float a 5 a=3.0 6 for i in range(1000): 7 print(round(a*1000)/1000) 8 a=a+0.001

これで同じ出力が得られました。

補足情報(FW/ツールのバージョンなど)

Python 3.9.4
Cython version 0.29.24

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

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

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

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

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

guest

回答1

0

ベストアンサー

1000を掛けて四捨五入なりを行い、整数にしたあとで1000で割ればいいです

投稿2021/11/01 05:58

y_waiwai

総合スコア87851

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

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

ntsk2543

2021/11/01 07:41

ありがとうございました。追記で具体的な解決方法を示しました。
y_waiwai

2021/11/01 07:47

print(round(a*1000)/1000)
ntsk2543

2021/11/01 08:04

なるほど…私の勉強不足ですね。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.43%

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

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

質問する

関連した質問