【问题标题】:C# divide float up into single component integersC#将浮点数划分为单个分量整数
【发布时间】:2023-03-25 17:50:01
【问题描述】:

我在 Unity 中模拟数字显示,我需要知道将浮点数分解为一系列单独的整数。

举例

如果我的浮点数是 32.548

我需要五个单独的整数 3,2,5,4,8。我还需要一个额外的整数变量,即小数点后的位数。在这种情况下 3.

将 5 个整数放入一个数组中会很有用,例如 myIntegerArray[0] = 3 我的整数数组[1] = 2 等等。但这并不是那么重要,重要的部分是将浮点数划分为单个整数的代码。 一旦有了这些,我就可以使用它们来控制在一系列不同对象上显示哪些材质。

【问题讨论】:

    标签: c# floating-point int


    【解决方案1】:
    var asString = 32.548.ToString();
    var decimalPartLength = asString.Split('.').Last().Length;
    var digitArray = asString.Where(char.IsDigit).Select(char.GetNumericValue).ToArray();
    

    【讨论】:

    • 试用了这段代码,但还没有测试一切,它看起来很有希望。没有什么问题,因为我没有使用 system.linq。不过现在好像没事了。感谢一百万的代码,这对我来说是最容易理解的。
    【解决方案2】:

    一种解决方案是将浮点值转换为字符串,删除点,然后逐个字符地处理它。

    一旦删除点和负号(如果有),字符串的长度也会为您提供位数。

    例子:

    float value = 32.548;
    string temp = value.ToString("0.00000");
    temp = temp.Replace(".", "").Replace("-", "");
    int numDigits = temp.Length;
    int myIntegerArray[numDigits];
    for (int i = 0; i < numDigits; i++)
    {
       myIntegerArray[i] = Int32.Parse(temp[i]);
    }
    

    【讨论】:

    • 请回复!每个人都建议过类似的系统,先转换为字符串,然后插入数组。我将依次尝试每一个。再次感谢!
    • 我的荣幸。请记住,此解决方案不需要 linq,因为您明确表示您正在 Unity 上进行开发。虽然非常强大,但 linq 可能较慢或与您的目标平台不完全兼容。如果您喜欢此解决方案,请随时投票 ;)
    【解决方案3】:
    using System;
    using System.Linq;
    
    public class Program
    {
        public static void Main()
        {
            var sValue = Convert.ToString(32.548);
    
            var normalized = sValue.Where(s => char.IsDigit(s));
    
            var charArray = sValue.ToArray();
    
            var numArray = normalized.Select(num => char.GetNumericValue(num)).ToList();
    
            numArray.ForEach(num => Console.WriteLine(num));
        }
    }
    

    【讨论】:

    • 可能会使用正则表达式而不是替换,但上面是一个 hello world 示例
    • 正则表达式可能是矫枉过正。
    【解决方案4】:

    一种方法是将浮点数转换为字符串,然后处理字符:

    Double d = 32.548;
    String s = Convert.ToString(d);
    IEnumerable<Int32> ints =
      s
      .Where(c => Char.IsDigit(c))
      .Select(c => Convert.ToInt32(c.ToString()));
    
    Int32 indexOfDecimal = s.IndexOf('.');
    Int32 decimalPlaces = (indexOfDecimal == -1) ? 0 : (s.Length - indexOfDecimal) - 1;
    

    【讨论】:

    • 谢谢克里斯!!我试图准确理解最后一行在这里所说的......尤其是冒号之前的部分: (indexOfDecimal == -1) ? 0 : 像 if 语句吗?
    • 是的,它是ternary operator。如果值是整数(例如Double d = 32),我将其包括在内。该语句基本上说:“如果没有小数点,则返回零,否则返回小数点右侧的字符数(-1,因此它不包括小数点本身)”。跨度>
    • 啊,这很清楚,我现在明白了!非常感谢。在这种情况下, == -1 表示如果 indexOfDecimal 没有值,而不是我猜的空值,它的值是“没有值”之类的,这真的很难用词来形容 xD
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    相关资源
    最近更新 更多