2017-08-14 14 views
0

:Mathf.Approximatelyがtrueを返すが構造体の拡張メソッド

someVector.FixRounding(); //round vector's values to integers if the difference is 1 epsilon 
float x = someVector.x; //still getting old value 

public static void FixRounding(this Vector3 v) 
{ 
    if (Mathf.Approximately(v.x, Mathf.Round(v.x))) v.x = Mathf.Round(v.x); 
    if (Mathf.Approximately(v.y, Mathf.Round(v.y))) v.y = Mathf.Round(v.y); 
    if (Mathf.Approximately(v.z, Mathf.Round(v.z))) v.z = Mathf.Round(v.z); 
} 

FixRounding方法は、実際には、ベクトルの値を変更しません。

+0

スクリーンショットには、既に丸められている可能性のある値が表示されます。だから、私は明示的にラウンドトリップ形式を使って文字列に変換するか、 'BitConverter.DoubleToInt64Bits'を使うことを提案しました。 –

+0

@AlexeiLevenkov:今すぐ完了 - あなたのコメントを削除したいことがあります。 –

答えて

5

この宣言:

public static void FixRounding(this Vector3 v) 

は... vは値でを渡されていること、そしてそれがdocumentationが正しいと仮定すると、構造体です。したがって、変更した内容は発信者には表示されません。

public static void FixRounding(ref Vector3 v) 

をとしてそれを呼び出す:ここ

TypeDeclaringMethod.FixRounding(ref pos); 

が失敗した値によって渡された構造体を変更しようとする拡張メソッドのデモだあなたはそれ定期的な方法で行い、参照によってvに合格する必要があります。

using System; 

struct Vector3 
{ 
    public float x, y, z; 

    public override string ToString() => $"x={x}; y={y}; z={z}"; 
} 

static class Extensions 
{ 
    public static void DoubleComponents(this Vector3 v) 
    { 
     v.x *= 2; 
     v.y *= 2; 
     v.z *= 2; 
    } 

    public static void DoubleComponentsByRef(ref Vector3 v) 
    { 
     v.x *= 2; 
     v.y *= 2; 
     v.z *= 2; 
    } 
} 

class Test 
{ 
    static void Main() 
    { 
     Vector3 vec = new Vector3 { x = 10, y = 20, z = 30 }; 
     Console.WriteLine(vec); // x=10; y=20; z=30 
     vec.DoubleComponents(); 
     Console.WriteLine(vec); // Still x=10; y=20; z=30 
     Extensions.DoubleComponentsByRef(ref vec); 
     Console.WriteLine(vec); // x=20; y=40; z=60 
    } 
} 

Vector3がクラスの場合、2行目はx = 20となります。 y = 40; z = 60 ...ですが、構造体なので、渡された値を変更しても呼び出し元の視点から変更されません。これを参照渡しすると出力の3行目が修正されます。

+0

ここで構造体を使った拡張メソッドが問題になっているようです。もし私が何かを見逃していなければ、問題は解決されます。 – MCpiroman

+0

@MCpiroman:すべてのコメントを削除します(質問とこの回答の両方)。私はそれが明らかに浮動小数点の問題ではないので、質問を再開しました –

+0

まだ複製:https://stackoverflow.com/a/11725046/7249108 – MCpiroman

関連する問題