【问题标题】:setting the fourth decimal place in a number to 1 or 0将数字中的第四位小数设置为 1 或 0
【发布时间】:2013-07-03 20:16:29
【问题描述】:

在我的基于 Windows 的应用程序中,我进行了从公制到英制的单位转换,然后再转换回来。这在理论上可行,除非我要执行以下操作

-将默认单位设置为英制

-更新数字(现在假设我的数字等于 1000 英寸)

-将默认单位设置为公制

-更新数字(现在假设我的数字等于 25400 毫米)

-将默认设置回英制

-更新数字(这是问题所在)

--此时我的数字不会更新,因为如果数字已经在这些单位中,我的代码不会转换(如果你愿意,我可以显示代码,但我的问题不需要它)这是需要的我认为克服此错误的最简单方法是将数字中的小数点后四位更改为公制为 0 或英制为 1,但我不能只说

number += 0.0001 or number -= 0.0001

因为在转换过程中我可以得到一个像 3452.823591384023840583 这样的数字,但我会使用这个数字并且只显示前三位小数 3452.823 所以对于这个例子,我想取我的数字并更改第四位小数(因为它无论如何都没有显示)并将其更改为 0 或 1。所以这就是我想要的...

取一个数字,让我们使用 1.234567 并更改第四个小数位(5)并将其更改为 0 或 1,无论我想要什么,现在就使用 0。所以现在我将有一个数字是 1.234067。一旦我有了这个新数字,我希望能够检查 if 语句中的第四个小数位,看看它是 0 还是 1 等等

if(number.getFourthDemialPlace() == 1) DO STUFF

如果需要进一步解释或代码,我很乐意提供,谢谢。

【问题讨论】:

  • 这听起来像是你试图想出一个非常丑陋的黑客来解决一个相当简单的问题。可能有多种方法可以解决这个问题,而无需借助某种“神奇”的占位符值。

标签: c# math numbers decimal


【解决方案1】:

您可能应该使用格式来处理您的实际问题...

要提取特定数字,最直接的方法是乘以/除以10^x,将您感兴趣的数字移到一个位置,转换为int/BigInteger,然后得到% 10的结果:

 ((int)(value * 10000) %10 )

【讨论】:

    【解决方案2】:

    这就是我要做的,这是我认为最简单的方法。 (不处理大量计算等)。将数字转换为字符串(使用ToString( ) 方法)。然后,将小数点后的第四个字符替换为 0/1。然后,将其转换回数字。您可以通过执行相同的操作来检查小数点后四位...

    【讨论】:

      【解决方案3】:

      为什么不将单位保持在一种类型中?并对修饰符进行转换
      我会举一个例子让你明白我的意思:

      public enum UnitType
      {
          Feet = 0 ,Meters = 1
      }
      
      public Length
      {
          public Length(decimal lenInMeters)
          {
              _lenInMeters = lenInMeters;
          }
      
          private decimal _lenInMeters;
          private decimal ConvertToMeters(decimal feet)
          {
              //do conversion
          }
      
          private decimal ConvertToFeet(decimal meter)
          {
              //do conversion
          }
      
          private void ChangeByFeet(decimal feetChange)
          {
              _lenInMeters + ConvertToMeters(feetChange);
          }
      
          public void Change(decimal amount, UnitType units)
          {
                 switch(units)
                 {
                    case(UnitType.Meters):
                        _lenInMeters+=amount;
                        return;
                    case(UnitType.Feet):
                        _lenInMeters+=ConvertToMeters(amount);
                        return;
                    case(default):
                        throw new ApplicationException("not supported type");
                 }
          }
      
          public decimal InFeet
          {
              get
              {
                  return ConvertToFeet(_lenInMeters);
              }
          }
      
          public decimal InMeters
          {
              get
              {
                  return _lenInMeters;
              }
          }
      }
      

      这样您就不必在转换之间悠悠球,并且您尝试做的事情不像您最初建议的那样不透明。

      【讨论】:

        猜你喜欢
        • 2011-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-03
        • 2012-08-16
        • 2022-01-11
        相关资源
        最近更新 更多