双类型DependencyProperties在WinRT中具有错误的值

时间:2012-10-02 04:08:12

标签: double windows-runtime dependency-properties

我有一个自定义控件,其依赖属性为double类型。当我从XAML设置此属性时,假设我将12.34作为此属性的值。该属性更改回调,给出值为12.3400001525879,实际值具有尾随垃圾十进制值。

(Silverlight不是这种情况)

只有当我们通过XAML设置值时才会发生这种情况,并且只有当我们有多个十进制值时才会发生这种情况。

    public double Value
    {
        get { return (double)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Value.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(double), typeof(TextBoxExt), new PropertyMetadata(null, new PropertyChangedCallback(OnValueChanged)));

    private static void OnValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine(e.NewValue);//Not priniting the exact value.
    }

有人面临同样的问题吗?

2 个答案:

答案 0 :(得分:1)

并非所有十进制值都可以由floatdouble等固定宽度二进制浮点类型精确表示。不完全可表示的十进制值(如12.34)将四舍五入为可表示的最接近的值。您可以在David Goldberg的优秀文章"What Every Computer Scientist Should Know About Floating-Point Arithmetic."

中阅读有关浮点类型的所有内容

在这种情况下,您提到的实际值表明(a)值12.34被解析为float或(b)它在某个时刻被转换为float。这有点奇怪,但可能是设计或错误。无论是否是错误,如果您在软件中使用浮点类型,则需要考虑潜在的舍入错误。

答案 1 :(得分:0)

我在测试中可以看到同样的问题。看起来很像木星中的一个错误。我会在MSDN论坛上报告。