为什么 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"/>
...
floatvalue 是 float 类型的 属性。
如果用户在 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)
代码优先:
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
...
<xctk:SingleUpDown Value="{Binding floatvalue}" FormatString="F7" Minimum="0"/>
...
floatvalue 是 float 类型的 属性。
如果用户在 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)