トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

【Unity】小数点第2以下を切り捨てる【C#】

VRコントローラーのtransform.Positionの各値を小数点第1位までにして変数に入れたい。

コントローラーなのでPositionの値はめっちゃ動くし小数点何位までなのか分からない。

小数点以下の桁数を指定して丸めることはできない

桁数を指定して丸めることはできないらしい

ameblo.jp

しかし小数点以下の任意の場所を切り捨てる関数はUnityに存在していません(たぶん)
(12.345 を 12.3 にしたい等)
 
そうなると多くの場合計算を駆使して実現しようとするはずです
例えば次のような感じ
-------------------------------
// 0.31 を 0.3 にしたい場合(小数点第一以下切り捨ての例)
s2 = 0.31f;
s2 = s2 * 10;                 //←0.31 を 一時的に10倍にし 3.1 にする
s2 = Mathf.Floor(s2) / 10; //←3.1 の .1 部分をFloorで切り捨て 3 にし
                                      //その後10で割る事で 0.3 になり目的達成
-------------------------------

このように小数点の位置を掛け算でずらして処理するやり方は
C言語をはじめ、色々なところで使われています

だそうです。

でもfloatが何桁か分からないときは使いにくいですね;;

しょうがないのかな?

とりあえず2桁落とすようにした

    private Vector3 RoundVector(Vector3 vector3)
    {
 
        int keta = 100;
        float x = vector3.x * keta;
        float y = vector3.y * keta;
        float z = vector3.z * keta;
 
        x = Mathf.Floor(x) / keta;
        y = Mathf.Floor(y) / keta;
        z = Mathf.Floor(z) / keta;

        vector3 = new Vector3(x, y, z);
        return vector3;
        
    }

うんこみたいなコードな気もするけどこれでできている?のかな?

textとして表示する場合

textとして表示するだけなら

x.ToString("N2") 

でできる。

N2じゃなくてf2でもいい?何が違うんだ???

ここに書いてたけど、よくわからない

docs.microsoft.com

F:必要に応じて負の符号が付く整数と小数

N:必要に応じて負の符号が付く整数と小数、桁区切り記号、および小数点記号。

develop.hateblo.jp

takachan.hatenablog.com

ToString()をfloatに戻す

ToStringの使い勝手が良さそうなのでいったんToStringで桁を指定してから、floatに戻すことにします。

というか一番上の記事でもそうしてた。

    private Vector3 RoundVector(Vector3 vector3)
    {
        float x = vector3.x;
        float y = vector3.y;
        float z = vector3.z;

        x = float.Parse(x.ToString("f2"));
        y = float.Parse(y.ToString("f2"));
        z = float.Parse(z.ToString("f2"));

        vector3 = new Vector3(x, y, z);
        return vector3;
        
    }

これでよいのだろうか?debug表示してないので確かめてない;;