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

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

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

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

Q&A

解決済

3回答

37692閲覧

指数表記を少数表記にしたい

jotaku

総合スコア40

Python

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

0グッド

1クリップ

投稿2019/04/23 04:52

編集2019/04/23 05:53

-9.90859727969941E-06
このような数値をCSVファイルに出力する際に小数点表示に
したいです
どのようにしたらよろしいですか?。
result_df=pd.DataFrame()
result_df["X"]=X_list
result_df["Y"]=Y_list
result_df.to_csv(output_path,index=False,encoding="cp932")
Xが指数表記です

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

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

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

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

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

y_waiwai

2019/04/23 04:53

そのCSVファイルの出力のコードを提示しましょう。
can110

2019/04/23 04:56

現状の「指数表記される」というソースコードを提示ください。
stdio

2019/04/23 05:02 編集

一端文字列に直してからEの後ろにある数字を取得すればいけそうな気がしますが... 現状では何とも言えませんね。
guest

回答3

0

ベストアンサー

float_formatを指定してください。

Pythonでテキストファイルの出力
pandas.DataFrame.to_csv

Python

1import pandas as pd 2df = pd.DataFrame([-9.90859727969941E-06]) 3df.to_csv('ret.csv',float_format='%.18f') 4# ,0 5# 0,-0.000009908597279699

投稿2019/04/23 05:59

can110

総合スコア38352

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

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

jotaku

2019/04/23 06:01

ありがとうございました。
guest

0

Python

1v = -9.90859727969941E-06 2print('%f' % v)) 3print(f'{v:f}') 4print('{:f}'.format(v))

など3つぐらい方法がありますがどれも同様の結果であり
-0.000010
という文字列が得られます。小数点以下7桁で四捨五入されるため元の値に対して大分誤差があるのですがその程度の誤差を気にしないならこれでやるのが簡単でしょう。

もし「小数点以下10桁まで表示する」のように桁数が固定でよければ
'%.10f' % v
のようにすれば簡単です。(他の2つの方法でも指定方法は似たようなものです)

一方、元の値の精度を極力保存したいならもっと緻密な方法が必要になると思います。標準提供のライブラリーでそれを直接行えるようなものを自分は知らないので自前で素朴に実装するなら

example.py

Python

1def format_float(v): 2 s = str(v) 3 if 'e' in s: 4 i = s.index('e') 5 exponent = int(s[i + 1:]) 6 mantissa = s[:i] 7 if '.' not in mantissa: 8 frac_len = 0 9 else: 10 frac_len = len(mantissa) - mantissa.index('.') - 1 11 frac_len -= exponent 12 if frac_len <= 0: 13 s = str(int(v)) 14 else: 15 s = f'%.{int(frac_len)}f' % v 16 if '.' not in s: 17 s += '.0' 18 return s 19 20for v in [-9.90859727969941e-06, 1e16, 0]: 21 print(str(v)) 22 print('=>', format_float(v))

===>

bash

1$ python3 example.py 2-9.90859727969941e-06 3=> -0.00000990859727969941 41e+16 5=> 10000000000000000.0 60 7=> 0.0

ところでcsvに出力するとのことですがそれを読むプログラムは何でしょうか?Excelでもpandasやnumpyで読んでも読めると思います。というよりは「小数形式は読み込めるが指数形式だと読み込めない」プログラムの方が珍しくないでしょうか?

少なくとも普通のプログラムを用いてCSVファイルを読み込むならわざわざ指数形式を小数点形式に変換する必要はないと思います。つまり下手に変換して精度が落ちる危険をおかすよりはstr(v)の値をそのまま出力した方が無難かも知れません。

投稿2019/04/23 06:28

KSwordOfHaste

総合スコア18404

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

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

KSwordOfHaste

2019/04/23 06:36

pandasでの出力を想定しているのに対してPythonでfloatをstrへ変換する方法についてコメントしてしまいました。精度が落ちることを気にするならむしろ元のコードのままがよいというべきでした。 細かい誤差を気にせず小数以下の桁数を固定にしてよいならcan110さん回答にある方法が適切だと思います。
jotaku

2019/04/23 07:21

誤差の件勉強になりました今後場合によって使い分けたいと思います。
guest

0

過去にほぼ同一の質問がされています。
https://teratail.com/questions/8833

投稿2019/04/23 04:59

tetsunosuke

総合スコア1295

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

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

otn

2019/04/23 05:38

printで出力するならこれでいいのですが、何らかのライブラリでCSV出力しているとすると、何のライブラリでどうやってCSV出力しているのかにより対処が異なると言うことで、追記依頼が出ています。
tetsunosuke

2019/04/23 05:40

なるほど 補足ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問