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

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

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

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Q&A

解決済

3回答

2256閲覧

R言語 数字をまるめたい

fermat

総合スコア183

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

0グッド

0クリップ

投稿2017/12/06 03:27

R

1>a<-2.2000003 2>a<-sprintf('%0.1f',a) 3>a 4[1]"2.2"

となるのですが
as.numeric型で数値変換するとせっかく切り落とした数値が復活します

R

1>a<-as.numeric(a) 2>[1] 2.2000003

切り落とした数値を復活させないまま"2.2"を数値化するにはどうしたらいいでしょうか。
よろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

私の環境では再現しませんが……。

R

1> a<-2.2000003 2> a<-sprintf("%0.1f", a) 3> a 4[1] "2.2" 5> as.numeric(a) 6[1] 2.2 7> sessionInfo() 8R version 3.2.0 (2015-04-16) 9Platform: x86_64-pc-linux-gnu (64-bit) 10Running under: Ubuntu 14.04.5 LTS 11 12locale: 13 [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C 14 [3] LC_TIME=ja_JP.UTF-8 LC_COLLATE=en_US.UTF-8 15 [5] LC_MONETARY=ja_JP.UTF-8 LC_MESSAGES=en_US.UTF-8 16 [7] LC_PAPER=ja_JP.UTF-8 LC_NAME=C 17 [9] LC_ADDRESS=C LC_TELEPHONE=C 18[11] LC_MEASUREMENT=ja_JP.UTF-8 LC_IDENTIFICATION=C

基本的にコンピューターは2進数に変換した形でしか実数を扱えないので、小数点以下の細かい桁まで完璧に再現できるとの前提でプログラムを書くと問題が出ることがあります。丸めた数値をどう使うつもりか存じませんが、表示だけの問題なら文字列として保持しておくのも一つの現実的な対処法でしょう。

投稿2017/12/06 03:58

KojiDoi

総合スコア13671

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

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

KSwordOfHaste

2017/12/06 04:04

あ、誤差の問題というよりfloat/doubleの精度の桁数の問題だったのでしょうかね? 自分の回答は大雑把すぎたようです。
KojiDoi

2017/12/06 04:10

私も実数の内部表現についてそれほど深い見識があるわけではないのですが、KSwordOhHasteさんの回答がそれほどおおざっぱすぎるとは感じません。ここで問題なのは「実数は正確には再現できると期待してはいけない(誤差を減らしたり、誤差が問題にならないようにする工夫の余地はある)」ということに尽きると思います。
fermat

2017/12/06 05:11

再現性が無いとのご指摘で、こちらのR言語の仕様を確認したところ、 有効桁数のオプションを変えていたためこのような結果になったことが判明しました。 気温によって植物に水をやる量を決めたいのですが、 計算途中の見やすさから数字をまるめてしまえ~という感じで作業をすすめていました。 計算はあくまでも計算として処理しようと考え直して、再度Rのスクリプトを組みなおしています。 ありがとうございました。
guest

0

a <- 2.2000003 a <- round(a,digits = 1)

投稿2017/12/06 03:53

yeat

総合スコア28

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

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

fermat

2017/12/06 05:06

実はround関数でもうまく行かなかったのですが -8.984E+8みたいな表記が苦手で、options(digits=22)にして計算していたことが原因と判明しました。 今回、質問が言葉足らずでした。すみません。 いつもありがとうございます。
guest

0

浮動小数点数につきものの誤差の話と思います。一般によく用いられる浮動小数点数の内部表現は2進数のため、0.1を正確には表せず必ず誤差のある値でしか数値を扱えません。Rでも同様のようです。

http://www.hep.by/gnu/r-patched/r-faq/R-FAQ_82.html

「そもそも数値として2.2をRで正確に表すことはできない」というところから考えてみてください。浮動小数点数は誤差がある点を踏まえて用いるものと考えてくください。

投稿2017/12/06 03:54

KSwordOfHaste

総合スコア18394

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

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

fermat

2017/12/06 05:15

練習としてデータをライブラリから引っ張ってきて、Rを動かしたりするのですが、 小数点が出てきたり、round使うとと結構いい加減?な印象もある言語・・・と思う事があります。 言語のクセを見て、適当なところで諦めるしかないのかなとも感じています。 ありがとうございます。
KSwordOfHaste

2017/12/06 05:20

> 言語のクセを見て、適当なところで諦めるしかない おっしゃるとおりですが、それをRのクセだと思うのはRに気の毒と思います。 一般のコンピューター言語全般にいえる浮動小数点数のクセですw; そもそもプロセッサーに内蔵している浮動小数点数の演算ユニットからしてそういうものなのです。
fermat

2017/12/06 05:26

そうですね、Rに気の毒(笑) 言われてみると言語全般の問題と気づきましたが、便利さゆえについRに多くを求めてしまいます(;^ω^)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問