C#从float变量中获取数字

Kar*_*ten 14 .net c# floating-point

我有一个浮点变量,只想得到逗号之后的部分,所以如果我有3.14.我想得到14作为整数.我怎样才能做到这一点?

Mic*_*ael 35

您可以从值本身中减去整数部分以检索小数部分.

float x = 3.14
float fractionalPortion = x - Math.Truncate(x);
Run Code Online (Sandbox Code Playgroud)

然后,您可以将其相乘以获得以您想要的任何精度表示为整数的小数部分.

将小数部分映射到整数具有一些挑战 - 许多浮点数不能表示为基数为10的整数,因此可能需要比整数可以支持的更多数字来表示.

另外,3.1和3.01这样的数字是什么情况?直接映射到整数都会导致1.

  • 不要这样做,因为karstenkousgaard想要14作为答案,而不是0,14 (3认同)
  • 你不能乘以比数位数大10的幂...所以这省略了问题的棘手部分. (3认同)
  • 那么Math.Truncate而不是Floor呢? (3认同)

Tyl*_*ier 8

尝试

float n = 3.14f;
int fractionalPart = new System.Version(n.ToString()).Minor;
Run Code Online (Sandbox Code Playgroud)

大卫的"作弊版"答案目前似乎并不是很受欢迎,但在一天中的大部分时间里,我找到了System.Version类.它有一个构造函数,它接受一个字符串.使用Reflector,我看到它通过将字符串拆分成数组来工作.我跑了一个测试得到任意数字1234567891.1234567891m的小数部分.使用1,000,000次迭代,它比我发布的其他答案快50%,尽管我首先必须为了Version构造函数将十进制数转换为字符串.所以大卫在使用字符串转换概念时遇到了一个糟糕的突破,这似乎是一个很好的方法.微软做到了.


Dav*_*vid 6

欺骗的方式是:

    private Int32 FractionalPart(double n)
    {
        string s = n.ToString("#.#########", System.Globalization.CultureInfo.InvariantCulture);
        return Int32.Parse(s.Substring(s.IndexOf(".") + 1));
    }
Run Code Online (Sandbox Code Playgroud)

edit2:好的确定OK.这是我能想到的最偏执的永不失败的版本.这将返回浮点数的小数部分的前9位(或更少,如果没有那么多).这保证不会溢出Int32.我们使用不变文化,因此我们知道我们可以使用句点作为小数分隔符.

  • 改变"." 到System.Globalization.CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator (5认同)