dotnet/wpf

WPF - slider precision is not correct.

Open

#8,819 创建于 2024年2月16日

在 GitHub 查看
 (11 评论) (1 反应) (0 负责人)C# (6,683 star) (1,126 fork)batch import
:construction: work in progressGood First IssueInvestigatehelp wanted

描述

Description

Hello,

we use slider with this configuration

        <Slider
            Grid.Row="3"
            Grid.Column="1"
            IsSnapToTickEnabled="True"
            TickFrequency="0.1"
            Minimum="{Binding Gamma.Minimum}"
            Maximum="{Binding Gamma.Maximum}"
            Value="{Binding Gamma.Value}"/>

Gamma.Minimum is 0.5. Gamma.Maximum is 4. Gamma.Value is bounded. All properties are double. Problem is that when Value is 1.9 and i move slider very little then value does not change to 2 or 1.8 but it changes to 1.9000000000000001 which is not correct. Value should be 2.

I have tried to debug it and I think that I have found problem at this line https://github.com/dotnet/wpf/blob/2fdb74d7b11465f36246b7caf06fa00e9c6d8454/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/Slider.cs#L1135 When * TickFrequency is used value result of multiplication brings precision problem.

Part of the code from the link above.

                else if (DoubleUtil.GreaterThanZero(TickFrequency))
                {
                    previous = Minimum + (Math.Round(((value - Minimum) / TickFrequency)) * TickFrequency);
                    next = Math.Min(Maximum, previous + TickFrequency);
                }

Reproduction Steps

Add Slider with binding to double value

        <Slider
            Grid.Row="3"
            Grid.Column="1"
            IsSnapToTickEnabled="True"
            TickFrequency="0.1"
            Minimum="0.5"
            Maximum="4"
            Value="{Binding Value}"/>

Set value to 1.9 from code. Try to move slidre a little. See problem.

Expected behavior

  • Value should be set to 2.0

Actual behavior

Value is set to 1.9000000000000001.

Regression?

No response

Known Workarounds

No response

Impact

No response

Configuration

No response

Other information

No response

贡献者指南