前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/01 07:41
2021/11/01 07:47
2021/11/01 08:04