質問: int(rcvMSG[3]); } ``` ### 疑問点 double型には6~7桁の精度があります。 これをキャストでfloatに変換したときには, floatの精度はdoubleの精度を継承するのでしょうか。
回答: > > 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を使うようなケース ``` import java.util.List; import java.util.ArrayList; void setup() { List list = new ArrayList(); list.add("a"); list.add("a"); } ... ```