【问题标题】:Binding ComboBox SelectedItem to double将 ComboBox SelectedItem 绑定为双精度
【发布时间】:2012-09-10 21:34:01
【问题描述】:

我的 ComboBox 的 ItemsSource 绑定到 List<double> options 并且 SelectedItem 绑定到属性 double SelectedOption

如果options 包含值0.0060F, 0.0075F, 0.0100FSelectedItem = 0.0060F,ComboBox 应该但不会反映这一点。相反,选择 ComboBox 会显示 options 列表项及其奇怪的十进制表示。是否可以对具有不可预测表示的double 类型的变量进行数据绑定?

代码

视图模型:

//Properties
public List<double> Options{get;set;}
public double SelectedOption{get;set;}

//Constructor
public ViewModel()
{
    Options =  new List<double>();
    Options.Add(0.0060F);
    Options.Add(0.0075F);
    Options.Add(0.0100F);

    SelectedOption = 0.0060F;
}

绑定:

<ComboBox ItemsSource="{Binding Path=Options}" 
    SelectedItem="{Binding Path=SelectedOption, Mode=TwoWay}" />

组合框中显示的选项有:

  • 0.00600000005215406
  • 0.00749999983236194
  • 0.00999999977648258

【问题讨论】:

  • 提供一些代码。这应该没有问题。
  • 您是说 Double.ToString() 为您提供不同的格式,具体取决于值。或者浮点固有的不准确性并没有给您添加的确切值?
  • 我已经添加了如何设置所有内容的代码。当应用程序调试时,所有这些浮点数都显示在 Visual Studio 监视中,并带有它们分配的确切值。即使在手表中使用 .ToString() 也会显示我分配的值,而不是帖子列表中的长十进制数字。
  • @TonyHopkinson 我相信这是由于浮点数的不准确性引起的。但似乎 0.0060F == 0.0060F 是正确的,并且绑定将基于此工作。该列表包含一个 0.0060F 并且所选选项设置为 0.0060F,似乎这些是相关的。
  • 恐怕不是,基本上如果重要的是要正确选择精度,请使用定点类型(例如十进制)而不是浮点。 FP 并不意味着准确或精确,它意味着有一个小数点在某处浮动。当您增加了处理 FP 不准确的开销时,任何所谓的速度优势都将不复存在。

标签: c# silverlight data-binding combobox double


【解决方案1】:

也许您应该阅读一下什么是浮点数:http://csharpindepth.com/Articles/General/FloatingPoint.aspx

这些值用于给出尽可能接近现实的数字表示。如果您想要精确的值,请使用 System.Decimal

【讨论】:

  • 感谢您的参考。我的理解是,如果为两个双打分配相同的值,它们将相等,但事实并非如此。我听说过 Decimal,但速度较慢。看起来这可能是我唯一的选择。再次感谢!
  • 刚刚签入,Decimal 确实可以很好地解决这个问题。还没有真正在开发这个应用程序的时候看到它是否会导致速度变慢,但我看不出它太糟糕了。
  • 正如文章中所说,浮点值非常适合计算自然数,如温度、长度、颜色......在视频游戏中,尽可能快地计算数字的需求至关重要,并且这就是为什么一点点精度损失可以带来很多性能(另见here
  • 浮点问题在这里不适用,完全可以用doubles 填充ItemsControl。
  • 当然你可以放双打并格式化,但不要期望有一个精确的值。浮点数比小数快并不意味着小数不快。
猜你喜欢
  • 2019-11-10
  • 2014-10-10
  • 2011-11-01
  • 2015-06-28
  • 2017-04-30
  • 2023-04-03
  • 2010-10-24
  • 1970-01-01
  • 2021-10-18
相关资源
最近更新 更多