我有一个自定义控件,其依赖属性为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.
}
有人面临同样的问题吗?
答案 0 :(得分:1)
并非所有十进制值都可以由float
和double
等固定宽度二进制浮点类型精确表示。不完全可表示的十进制值(如12.34)将四舍五入为可表示的最接近的值。您可以在David Goldberg的优秀文章"What Every Computer Scientist Should Know About Floating-Point Arithmetic."
在这种情况下,您提到的实际值表明(a)值12.34被解析为float
或(b)它在某个时刻被转换为float
。这有点奇怪,但可能是设计或错误。无论是否是错误,如果您在软件中使用浮点类型,则需要考虑潜在的舍入错误。
答案 1 :(得分:0)
我在测试中可以看到同样的问题。看起来很像木星中的一个错误。我会在MSDN论坛上报告。