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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

6641閲覧

stringからdoubleへ変換したい

P5_USER

総合スコア73

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2017/11/27 13:14

###前提・実現したいこと
前提条件①:C#にてdouble型の変数A,B,C,DをA+" "+B+" "+C+" "+Dとしてstring型に変換している。(ブレークポイントによる変数の中身を確認済み)
前提条件②:①でのstring(UTF16)をUTF8にエンコードしてbyte[]に変換している。
(バイト配列の中身は2(UTF16:string)が50(UTF8:byte[])であった。4が52であり,5が53であった。)
前提条件③:byte[]はUDPでprocessingに通信している。

目標:processing内でdoubleを定義した変数の中に格納したい。

最悪,doubleを使わず桁の精度を維持してくれる方法で配列から各変数に取り出せればよいのですが...

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

int(rcvMSG[0])はOK float(rcvMSG[0])もOK double(rcvMSG[0])はダメでした。

###該当のソースコード

processing

1import hypermedia.net.*; 2UDP udp; 3double a,b,c,d; 4 5//途中のvoid setup()やvoid draw()は割愛 6 7void receive (byte[] data, String ip, int port) { 8 String message = new String(data); 9 String t = message; 10 String[] rcvMSG = splitTokens(t); 11 a = int(rcvMSG[0]); 12 b = int(rcvMSG[1]); 13 c = int(rcvMSG[2]); 14 d = int(rcvMSG[3]); 15}

###疑問点
double型には6~7桁の精度があります。
これをキャストでfloatに変換したときには,
floatの精度はdoubleの精度を継承するのでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

double型には6~7桁の精度があります。

これはご自分のプログラムでdouble型の変数へ6~7桁の精度の数値を設定しているという意味ですね?double型の本来の精度は10進数で15桁あまりありますので。

これをキャストでfloatに変換したときには,floatの精度はdoubleの精度を継承するのでしょうか。

本来の精度という意味ではfloatの精度は7桁程度ですので、doubleから変換した場合精度は落ちます。しかしながらC#側でdouble型変数へ設定している値がもともと7桁程度の精度しかないなら、実質上精度落ちはないと考えてもよいでしょう。


なお、Processingではdouble型を扱えないと思っておられるのでしょうか?もしそうだとするとそれは勘違いです。Processing(Javaバージョン)では多くのAPIはfloat型で設計されてますし、Javaと異なり浮動小数点数のリテラルはfloat型です(Javaはdoubleがリテラルのデフォルト)。しかしながらProcessingでもdouble型は使えます。精度落ちを気にするのでしたらProcessing側でもdoubleを用いればよいと思います。


追記:hskさんにコメントいただいたので追記します。

double(rcvMSG[0])はダメでした。

ここが質問者さんが解決したい肝心の点でしたね!見落としてました。この書き方はC++っぽい雰囲気ですが、Processing(つまりJava)ではキャスト構文はT(expression)とはかけず、(T)(expression)と書きます。しかし文字列から数値への変換はキャストでは書けずメソッドを使う必要があります。hskさんコメントにあるようにProcessingの標準機能としてはparseFloat(文字列式)が使えますがparseDouble(文字列式)は提供されていません。このような場合はJavaの機能を呼び出す必要があります。DoubleはJavaではdouble型(primitive型の一種)をクラスとしてラップするためのクラスですがそこに色々なユーティリティー関数が定義されています。parseDoubleもその一つです。

double d = Double.parseDouble(rcvMSG[0]);

以下は蛇足:

Doubleクラスはjava.langパッケージにあるのですが、Javaではjava.langパッケージのクラスは明示的なimportなしに使えます。Processingでも同様に省略できるようですね。しかしProcessingの標準機能にないJavaのクラスを使う必要がある場合、そのクラスがjava.langにないクラスの場合は明示的にimportすれば使えるということも覚えておくとよいと思います。このくらいまで仕組みが分かっているとProcessingでどうコードを書けばよいか分かり易くなると思います。

例:java.utilパッケージのList/ArrayListを使うようなケース

Processing

1import java.util.List; 2import java.util.ArrayList; 3 4void setup() { 5 List<String> list = new ArrayList(); 6 list.add("a"); 7 list.add("a"); 8} 9...

投稿2017/11/27 13:53

編集2017/11/28 01:12
KSwordOfHaste

総合スコア18394

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

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

hsk

2017/11/28 00:51 編集

C#タグでこの質問をみつけて、Processingを初めて知った者です。横から失礼します... 質問主様はきっとparseDoubleのような変換機能をご所望なのかと思います。parseFloat(string)は使えるけれど、parseDouble(string)はたしかにエラーになってしまいますね。 ズバリがあれば一番よいですが、代替としては、整数部・小数部を含めて有効にしたい桁数の範囲が決まっているなら、桁を分割して10^nを乗じた整数で送って、受信側で10^nで割ってそれぞれ足す手段もありますね。
KSwordOfHaste

2017/11/28 00:51

なるほど!ご指摘ありがとうございます。 processingの関数としては確かにparseDoubleがないですね。 String str = "1.2"; double d = Double.parseDouble(str); のようにJavaの機能を呼び出せばできますが、確かにProcessingではdoubleはあまり使い良くはなってませんね。
hsk

2017/11/28 00:59 編集

KSwordOfHasteさんの書かれたコード double d = Double.parseDouble(str); が、まさしく質問主様が求めていた回答かと思います! (頓珍漢なコメントかもしれませんが、、ProcessingやJavaに詳しくないものでスミマセン...) double a = Double.parseDouble("12.12345678901234"); println(a); (コンソール) 12.12345678901234
KSwordOfHaste

2017/11/28 00:59

なるほど・・・ 質問文の最後に書いてある「疑問点」のみ着目して回答してました>< 一応本文に追記もしておきます。 コメントいただきありがとうございました!
P5_USER

2017/11/28 01:01

疑問点にお答えいただきありがとうございます。 double型を宣言していてエラーが出ていないので,Processing上ではdoubleは確かに認識してくれているのですが a = double(rcvMSG[0]);としたとき, Type mismatch,"Java.lang.String" does not match with "double"とエラーの説明が返ってきました。 配列から,単一のdouble型変数に格納することは無理なのでしょうか? (そんなことは無いと思いますが...)
KSwordOfHaste

2017/11/28 01:12

回答へ追記しましたのでそれをご覧になってみてください。
P5_USER

2017/11/28 01:20

KSwordOfHasteさん,hskさん ありがとうございます! ちゃんと,エラーもなくコードが通りました。 本当にありがとうございます。
KSwordOfHaste

2017/11/28 01:29

察しが悪くてhskさんにコメントいただくまであさっての方向の回答になってました。失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問