为什么 DoubleUpDown/SingleUpDown 中显示的最后一位随机变化?

Why the last digits displayed in a DoubleUpDown/SingleUpDown changed randomly?

代码优先:

xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
...

<xctk:SingleUpDown Value="{Binding floatvalue}" FormatString="F7" Minimum="0"/>
...

floatvaluefloat 类型的 属性。

如果用户在 SingleUpDown 中键入“8.76543212”然后离开焦点(按 Tab),该值将更改为 8.7654320 (经常)或 8.7654300(很少)。

但是如果把{Binding}注释掉,

<xctk:SingleUpDown Value="0.1234567" FormatString="F7" Minimum="0"/>

一切正常。

综上所述,重现此问题有两个要求: 1.将值绑定到属性; 2.修改后改变焦点

我已经添加了一个自定义转换器来捕获更改前后的值,没有帮助。

我也试图深入研究 NumericUpDown 的源代码,但我找不到任何有用的信息。

后面的C#代码很简单:

public float floatvalue { get; set; }

NumericUpDown 的最后一位应该准确显示。

这就是 IEEE 754 的问题 - 它不是非常精确。尝试改用 decimal - 这是一个不会舍入的 128 位数据类型。

与其他floating-point类型相比,小数类型精度更高,范围更小,适合金融和货币计算 - decimal (C# Reference)