2016-05-04 5 views
1

WinRTにdoubleの値を代入する際に問題があります。System.Double type in Windows.Foundation.Size.Width/.Height on WinRT

次のコード

Windows.Foundation.Size size = new Windows.Foundation.Size(); 
double v = 179.166660308838; 
double v2 = v; 
size.Width = v; 
string t = $"v: {v}, v2: {v2}, size.Width: {size.Width}"; 

戻るv: 179.166660308838, v2: 179.166660308838, size.Width: 179.166656494141。ご覧のとおり、v2size.Widthの値が異なります。

私の質問は以下のとおりです。

  • ことがあるのはなぜ?
  • Windows.Foundation.Sizeに値を格納する必要がある場合(たとえば、MeasureOverride/ArrangeOverride)、予想通りに動作させるにはどうすればいいですか?
+2

Sizeプロパティの基になるストレージタイプは* double *ではなく* float *です。浮動小数点は6桁の桁上がりしかできません。そのうち多くを表示するとランダムノイズの数字が表示されます。 –

+0

@HansPassant私は見るのですが、なぜそれが 'System.Double'と宣言されていますか? – romanoza

+1

それはそうではありません、それはただ二倍を取るコンストラクタを持っています。 –

答えて

1

Hans Passantのコメントで「サイズのプロパティの基になるストレージタイプはdouble型ではなくfloat型です。float型は6桁の桁上がりしかできません。ランダムノイズ数字を参照してください。 (Documentation

あなたはリフレクションを使用して、それをチェックすることができます。

 var sizeFields = typeof(Windows.Foundation.Size).GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Select(f => $"{f.Name} - {f.FieldType.Name}"); 
     Debug.WriteLine(String.Join(", ", sizeFields)); 

と出力に次のように表示されます_width - Single, _height - Single

あなたがSystem.Runtime.WindowsRuntime.dllを分解した場合、あなたは、コンストラクタでこのコードが表示されます:

public Size(double width, double height) 
{ 
    if (width < 0.0) 
    throw new ArgumentException("width"); 
    if (height < 0.0) 
    throw new ArgumentException("height"); 
    this._width = (float) width; 
    this._height = (float) height; 
} 
関連する問題