【问题标题】:How to solve double-modulo issue for obtaining "0"in c# [duplicate]如何解决在c#中获取“0”的双模问题[重复]
【发布时间】:2014-07-03 09:59:59
【问题描述】:

我发现模数为 2.0 %0.1,这是双变量返回“0.09999”而不是“0”的结果。

我的代码是:

    var distanceFactor = slider.Value % step; //This do not return 0 when Value=2.0 and step=0.1
    if (distanceFactor != 0)
    {
        slider.Value -= distanceFactor;
    }    
    elseif(distanceFactor == 0)
    {
       //do something here
    }           
    txtblUnits.Text = Math.Round(slider.Value, 1).ToString();

当Value=2.0,step=0.1时,elseif条件下如何获取控制?

【问题讨论】:

  • 您可以检查 distanceFactor-step 是否小于预定义的 epsilon 值。顺便说一下,对双打取模不是一个好主意......
  • 模数不应与非整数值一起使用,因为在数学中,它是一个整数运算符。您正在尝试做 mod(2, 0.1) 这与做 mod(20,1) 相同
  • 查看提供的“重复问题”链接,有一个模运算符发生的等式......只需按常规方式进行操作:......double a, b, r; a = 120; b = .05; r = a - Math.floor(a / b) * b;跨度>

标签: c# .net casting double modulo


【解决方案1】:

Modulo % 对浮点数没有意义。在应用运算符之前,您应该将其相乘并将其强制转换为 int。

var distanceFactor = ((int) (slider.Value * 10D)) % (int) (step * 10D);

【讨论】:

  • 我不能这样做,因为这个slider.Value是通过移动滑块获得的,它是双倍的,如果我把它设为十进制,那么它将避免打印在文本块上的滑块进程的小阻力。跨度>
【解决方案2】:

Double 不适用于模数运算符,因此将模数与浮点数一起使用绝不是一个好主意,因此最好改用decimal

decimal slider = 2.0M, step = 0.1M;
var distanceFactor = slider % step; //This will return 0 when Value=2.0 and step=0.1
if (distanceFactor != 0)
{
    slider -= distanceFactor;
}
else if (distanceFactor == 0)
{
    //do something here
}
txtblUnits.Text = Math.Round(slider, 1).ToString();

txtblUnits.Text 将有 2.0

【讨论】:

  • slider id uielement 所以它的值总是双倍的。我们不是手动分配它是通过拖动滑块获得的。
  • 然后将其转换为十进制为decimal slider = (decimal)slider.Value;
  • 我不能这样做,因为这个slider.Value是通过移动滑块获得的,它是双倍的,如果我把它设为十进制,那么它将避免打印在文本块上的滑块进程的小阻力。跨度>
【解决方案3】:

正如我在您的帖子中评论的那样,为了正确使用模数运算符,请尝试执行以下操作:

string valueDecimalsString = (slider.Value - Math.Floor(slider.Value)).ToString();

int valueDecimals = valueDecimalsString.Substring(valueDecimalsString.IndexOf('.') + 1).Length;

//The same with step

int decimals = (valueDecimals > stepDecimals) ? valueDecimals : stepDecimals;

int value = (int)(slider.Value * Math.Pow(10, decimals))

//the same with step

var distanceFactor = value % stepValue; 

【讨论】:

  • 能否请您用文字解释一下您的逻辑?谢谢你
  • 当然 :) 由于模数是和整数运算符,我们在这里所做的是只用整数获得相同的除法。我们将每个数字乘以 10 的 n 次方,即 n 是这些数字中小数的最大值。
【解决方案4】:

你可以在if条件中将距离因子四舍五入到小数点0,像这样

if (Math.Round(distanceFactor,0) != 0)
{
    slider.Value -= distanceFactor;
}    
else
{
   //do something here
}

【讨论】:

  • 现在两个条件都为真... if 和 aslo elseif
  • 哦,对了,我改了代码。谢谢。
  • 什么是 distancefactor= 0.9999 ?
  • 从逻辑上讲它会转到其他部分
  • 我不能这样做,因为这个slider.Value是通过移动滑块获得的,它是双倍的,如果我把它设为十进制,那么它将避免打印在文本块上的滑块进程的小阻力。跨度>
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2011-06-09
  • 2020-11-02
  • 2010-10-24
  • 2013-02-02
  • 2020-02-06
  • 1970-01-01
  • 2019-06-07
相关资源
最近更新 更多